【问题标题】:Injected bean reset to NULL in the Aspect注入的 bean 在 Aspect 中重置为 NULL
【发布时间】: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 中,因为对切面所在的文件夹启用了组件扫描。任何帮助将不胜感激

【问题讨论】:

    标签: spring aop aspectj


    【解决方案1】:

    这是spring中使用切面时很常见的错误,你应该添加

    <context:spring-configured/>  
    

    <aop:aspectj-autoproxy />
    

    还加

    @Configurable
    @Aspect
    public class Enable
    

    到你的 appContext.xml

    aspectOf 是完成上述操作的另一种风格,但我更喜欢使用上下文的性质。

    【讨论】:

      【解决方案2】:

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

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

      这应该可以解决“NameService”在aspect中为null的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-25
        • 1970-01-01
        • 2018-03-08
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        相关资源
        最近更新 更多