@Aspect的java Spring自动连线bean为空
我有以下spring配置:
<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是存在的,并且正确地连接到了其他类中)以下事情让我困惑:
- 上下文:组件扫描是否应该拾取@Aspect?如果是的话,那么它肯定是一个spring管理的bean,因此autowired应该可以工作吗李>
- 如果context:component scan不用于创建方面,那么如何创建我的方面?我以为aop:aspectj autoproxy只是创建了一个beanPostProcessor来代理我的@Aspect类?如果不是spring管理的bean,它将如何做到这一点李>
很明显,你可以看出,我不知道事情应该如何从头开始
# 1 楼答案
aspect是一个单例对象,在Spring容器外部创建。XML配置的解决方案是使用Spring的工厂方法来检索方面
通过这种配置,aspect将被视为任何其他Springbean,自动布线将正常工作
您还必须对枚举对象和其他没有构造函数的对象或在Spring容器外部创建的对象使用factory方法
# 2 楼答案
另一种选择是将
@Configurable
添加到aspect类中,而不是与XML混为一谈