注入的实例变量在方面执行时为null

| 我在Spring AOP中遇到这个奇怪的问题,我希望有人能对此有所了解。 我正在使用CGLIB代理,执行以下方面时,我得到一个空指针:
@Aspect
@Component //i.e. Singleton
public class MyAspect {

    private static final Logger logger = LoggerFactory.getLogger(MyAspect.class);

    {

        logger.debug(\"new instance of MyAspect\");  //Line 1
    }

    private AutowireCapableBeanFactory factory;

    @Inject
    public MyAspect(AutowireCapableBeanFactory factory) {

        if (factory ==null) {

            logger.debug(\"your factory is null\");  //Line 2
        } else {

            logger.debug(\"your factory is not null\");
        }
        this.factory = factory;
    }

    @AfterReturning(pointcut = \"@annotation(com.domain.annotations.MyAnnotation)\")
    public void doSomething() {

        if (factory ==null) {

            logger.debug(\"your factory is null again\");  //Line 3
        }

                    // this is a request scoped bean
        MyRequest request = factory.getBean(MyRequest.class);  //Line 4



        if (request != null) {
            logger.debug(\"No\");
            }
        else {
            logger.debug(\"Yes\");
            }
    }
}
我在第4行收到NullPointerException。我可以看到在第3行的\“ factory \”为空,但是在第2行创建实例时,它不为空。我还在跟踪在第1行创建的实例。 该设计使用接口(JDK动态代理)进行工作。为什么我的实例变量在运行时变为空,并且可以解决这个问题?     
已邀请:
        总而言之,您不能将基于Spring的基于构造方法的注入与Aspects一起使用。这里有一个很好的论坛讨论此主题。 正如以上论坛中所建议的,我个人在各个方面都使用了基于属性的注入。下面的示例使您可以将服务注入审核方面。只要使方面实现ApplicationContextAware,就不需要任何其他XML配置。
@Aspect
@Component(\"auditAspect\")
public class AuditAspect implements ApplicationContextAware {

ApplicationContext context;

public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
    // do stuff with context here
}

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context = applicationContext;       
 }
    

要回复问题请先登录注册