我的方面的许多实例是在弹簧容器外面创建的,并且没有注入属性

时间:2014-08-05 00:17:29

标签: java spring aspectj spring-aop

我已经在@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包含其良好注入的属性。因此,运行时和每次执行方面时的问题。

我在这方面遇到了很多困难而没有成功。关于如何处理这个问题的任何想法?

提前致谢。

2 个答案:

答案 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提供一些想法。