我是新的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中,因为为方面所在的文件夹打开了组件扫描。任何帮助将不胜感激
答案 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的问题。