前言:我想代理一些类并拦截它们的方法(使用cglib
和BeanPostProcessor
)。这些类是Spring bean(@Service
),通常它们具有一些依赖性,例如repository
。
问题:当我为bean创建代理时,代理类的依赖项为null
(它们没有注入代理类中)。
我应该如何正确注入代理类的依赖关系?
场景:我想为实现service
接口的CompensateAware
类创建代理,然后在调用其方法之前打印一些日志。
我的代码如下
服务等级(原始等级)
@Service
public class RequestTrackingService implements CompensateAware {
@Autowired
public RequestTrackingRepository repository;
@Transactional
public void startTracking() {
RequestTrackingEntity requestTrackingEntity = new RequestTrackingEntity();
requestTrackingEntity.setStatus(TransactionStatus.RECEIVED);
requestTrackingEntity.setId(ServiceContext.getTrackingNo());
repository.save(requestTrackingEntity);
}
}
使用BeanPostProcessor
和cglib
创建Proxt类
@Component
public class ServiceProxy implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean,String beanName) {
if (bean instanceof CompensateAware) {
return beanProxy(bean);
} else return bean;
}
//Create proxy using cglib
private Object beanProxy(Object bean) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(bean.getclass());
enhancer.setCallback((MethodInterceptor) (o,method,objects,methodProxy) -> {
System.out.println("SOME LOG BEFORE METHOD");
return methodProxy.invokeSuper(o,objects);
});
return enhancer.create();
}
}
调用service
方法(startTracking
)
@Service
public class TestClass {
@Autowired
private RequestTrackingService service;
public void test() {
//I get NullPointerException because of null dependency (repository) in service
service.startTracking();
}
}
简而言之:
当我在我的应用中的某处调用startTracking
方法(代理类的方法)时,我得到NullPointerException
,因为它的依赖项(repository
)未注入并且为空。