我已经在@AfterThrowing
异常上创建了一个方面,该异常具有@Autowired属性。
我使用以下代码:
@Scope("singleton")
@Component
@Aspect
public class NotificationAspect
{
@Autowired
private EmailService emailService;
private final Logger log = LoggerFactory.getLogger(NotificationAspect.class);
public NotificationAspect()
{
log.info("****************** NotificationAspect: " + hashCode());
}
@AfterThrowing(pointcut="@annotation(com.creditsesame.integration.core.meta.NotifyOnFailures)",
throwing="ex")
public void executeOnException(ApiExecutionException ex) throws Throwable
{
emailService.sendNotification();
}
// more code //
}
我在方法executeOnException
上设置了一个断点,并确认在抛出异常时它会成功提升。我遇到的问题是,每次启动方面时都会创建许多未由spring处理的实例,并且因为Spring没有处理它们所有自动装配属性都为空。
在jboss启动应用程序的部署期间,我可以看到最初NotificationAspect
包含其良好注入的属性。因此,运行时和每次执行方面时的问题。
我在这方面遇到了很多困难而没有成功。关于如何处理这个问题的任何想法?
提前致谢。
答案 0 :(得分:1)
首先,我要说你不能在AspectJ方面使用依赖注入,而是必须使用spring方面。但是,我在Dependency injection with AspectJ and Spring找到了这个旧帖子。基本上,您需要告诉容器使用aspectOf()
方法作为factory-method
。我自己没试过,但它看起来可能有用。您可能需要使用xml来配置它。
答案 1 :(得分:0)
我可以找到使其适用于xml方法的答案,因为它比使用带注释的bean更容易(我没有运气使其与@Configurable一起工作)。
我必须将我的方面配置为:
<bean id="notificationAspect" factory-method="aspectOf" class="com.creditsesame.integration.core.aspect.NotificationAspect">
</bean> ^---Notice the factory-method with aspectOf()
关于spring文档说:
AspectJ的大多数方面都是单身方面。组态 这些方面非常简单:只需创建一个bean定义即可 正常引用方面类型,并包含bean属性 &#39;工厂方法=&#34; aspectOf&#34;&#39 ;.这确保了Spring获得了 方面实例通过询问AspectJ而不是尝试创建 实例本身。
有关详细信息,请参阅以下链接中的第7.8.1节和 7.8.3 :
http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-aj-ltw
感谢Andrew Eisenberg
指导我正确的方向,并Sotirios Delimanolis
提供一些想法。