我有以下弹簧配置:
<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 存在并且正确连接到其他类)以下事情让我感到困惑:
- context:component-scan 应该拾取 @Aspect 吗?如果是的话,那么它肯定是一个 spring 管理的 bean,因此自动装配应该可以工作?
- 如果 context:component-scan 不是用于创建方面,那么我的方面是如何创建的?我认为 aop:aspectj-autoproxy 只是创建一个 beanPostProcessor 来代理我的 @Aspect 类?如果它不是 Spring 管理的 bean,它会如何做到这一点?
显然你可以看出我不明白事情应该如何从头开始运作。
该方面是一个单例对象,并且是在 Spring 容器外部创建的。使用 XML 配置的解决方案是使用 Spring 的工厂方法来检索切面。
<bean id="syncLoggingAspect" class="uk.co.demo.SyncLoggingAspect"
factory-method="aspectOf" />
使用此配置,方面将被视为任何其他 Spring bean,并且自动装配将正常工作。
您还必须对 Enum 对象和其他没有构造函数的对象或在 Spring 容器外部创建的对象使用工厂方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)