注入的bean在Aspect中重置为NULL

时间:2014-04-06 20:26:08

标签: spring aop aspectj

我是新的Spring AOP和Aspectj 。我已经看到与注入bean相关的各种帖子在一个方面是null并且我遇到了类似的问题。我仍然不清楚我应该如何解决我目前遇到的问题。

问题:目前我们使用的是Spring 3.2.3,所有注入都是通过Annotation进行的。在我的例子中,依赖bean由Spring正确注入,但在执行时注入的bean为NULL。顺便说一句,这不会一直发生,但我可以说的是当它失败时的堆栈跟踪以及它成功时略有不同。当注入的bean不为null(我可以成功使用注入的bean服务)时,对before advice(在方面中)的调用总是在调用目标方法之前发生。当注入的bean为NULL时,调用方面是来自目标方法的第一个陈述。在这一点上,我认为另一个方面是实例化的,并没有引用注入的bean。这是我创建的方面:

@Component
@Aspect
public class Enable{

       private NameService nameService;

       @Autowired
       public void SetNameService(NameSerice service){          
            // service is injected properly
            this.nameSerice = service;
       }

       @Before("* *.*(..)")      
       public void callBefore(JoinPoint jp){    
            //sometimes nameService is null and sometimes it not not    
            this.nameService.lookup(...);    
       }
}

检查各种帖子,解决此问题的一种方法(如帖子中所建议的)是在XML配置文件中配置方面并使用factory-method =“aspectOf”并在配置中注入对NameService bean作为属性。我们的整个项目使用基于注释的注入(如前所述)。假设我仍然可以在XML配置文件中配置上述方面,我如何获取引用NameService bean Id以便我可以将其添加到配置中。我还看到了一篇与使用可配置注释相关的帖子,但我认为这是针对在Spring IOC之外创建的对象。

目前,这些方面是使用pom.xml中的Aspectj编译选项编织的。我们的root-context.xml包含条目上下文:annotation-config,并且方面被注入到Spring IOC中,因为为方面所在的文件夹打开了组件扫描。任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

这在春天使用方面时很常见,你应该添加

<context:spring-configured/>  

<aop:aspectj-autoproxy />

还要添加

@Configurable
@Aspect
public class Enable

到你的appContext.xml

aspectOf是另一种做上述内容的风格,但我更喜欢使用上下文的本质。

答案 1 :(得分:0)

回答这个问题可能为时已晚。但我遇到了同样的情况,我修复了如下。

1)在方面类中为“NameService”设置一个setter和getter。 2)用@Component(“nameService”)标记“NameService” 3)使用setter注入在xml配置中配置“nameService”。 4)进行更改后重新启动服务器。

这应解决方面为“NameService”获取null的问题。