弹簧自动连接豆@Aspect方面为空

2022-09-01 04:55:58

我有以下弹簧配置:

<context:component-scan base-package="uk.co.mysite.googlecontactsync.aop"/>

<bean name="simpleEmailSender" class="uk.co.mysite.util.email.simple.SimpleEmailSenderImplementation"/>

<aop:aspectj-autoproxy/>

然后我有一个方面:

@Aspect
public class SyncLoggingAspect {
    @Autowired
    private SimpleEmailSender simpleEmailSender

    @AfterReturning(value="execution(* uk.co.mysite.datasync.polling.Poller+.doPoll())", returning="pusher")
    public void afterPoll(Pusher pusher) {      
        simpleEmailSender.send(new PusherEmail(pusher));
    }
}

这个方面有效(我可以在afterPoll上命中断点),但simpleEmailSender是空的。不幸的是,我找不到关于为什么会这样的确切文档。(为了记录,我的simpleEmailSender bean存在并且已正确连接到其他类)以下事情让我感到困惑:

  1. 上下文:组件扫描是否应该@Aspect?如果是这样,那么肯定是一个弹簧管理的豆子,因此自动布线应该工作吗?
  2. 如果 context:component-scan 不是为了创建方面,那么我的方面是如何创建的?我以为aop:aspectj-autoproxy只是创建了一个beanPostProcessor来代理我的@Aspect类?如果它不是弹簧管理的豆子,它会如何做到这一点?

显然,你可以说我对事情应该如何从头开始工作没有了解。


答案 1

该方面是一个单例对象,是在 Spring 容器外部创建的。具有XML配置的解决方案是使用Spring的工厂方法来检索方面。

<bean id="syncLoggingAspect" class="uk.co.demo.SyncLoggingAspect" 
     factory-method="aspectOf" />

使用此配置,该方面将被视为任何其他Spring Bean,并且自动布线将正常工作。

您还必须在 Enum 对象和其他没有构造函数的对象或在 Spring 容器外部创建的对象上使用 factory-method。


答案 2

另一种选择是添加到方面类中,而不是弄乱 XML。@Configurable


推荐