【发布时间】:2014-04-06 20:26:07
【问题描述】:
我是新的 Spring AOP 和 Aspectj。我已经看到与注入 bean 相关的各种帖子,其中一个方面为空,我遇到了类似的问题。我仍然不清楚我应该如何着手解决我目前遇到的问题。
问题:目前我们使用的是 Spring 3.2.3,所有注入都是通过 Annotation 进行的。在我的例子中,依赖 bean 由 Spring 正确注入,但在执行时注入的 bean 为 NULL。顺便说一句,这并不总是发生,但我可以说的是堆栈跟踪失败时和成功时略有不同。当注入的 bean 不为空时(我可以成功使用注入的 bean 服务),对之前通知(在方面)的调用总是发生在目标方法被调用之前。当注入的 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 配置文件中配置方面并使用工厂方法 =“aspectOf”,并在配置中注入对NameService bean 作为属性。我们的整个项目使用基于注解的注入(如前所述)。假设我仍然可以在 XML 配置文件中配置上述方面,我如何获取引用 NameService bean Id 以便我可以将其添加到配置中。我还看到了一篇与使用可配置注释相关的帖子,但我认为这是针对在 Spring IOC 之外创建的对象。
目前,方面是使用 pom.xml 中的 Aspectj 编译选项编织的。我们的 root-context.xml 包含条目 context:annotation-config 并且切面被注入到 Spring IOC 中,因为对切面所在的文件夹启用了组件扫描。任何帮助将不胜感激
【问题讨论】: