前言:我想代理一些类并拦截它们的方法(使用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
)未注入,并且为null。
前言:我想代理一些类并拦截它们的方法(使用cglib和BeanPostProcessor)。这些类是spring bean(@Service),通常它们具有某些依赖性,例如...
增强器。create()