代理类中的空依赖项

问题描述 投票:2回答:1

前言:我想代理一些类并拦截它们的方法(使用cglibBeanPostProcessor)。这些类是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);
    }

}

使用BeanPostProcessorcglib创建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),通常它们具有某些依赖性,例如...

java spring spring-boot cglib dynamic-proxy
1个回答
0
投票

增强器。create()

© www.soinside.com 2019 - 2024. All rights reserved.