【问题标题】:Can I inject same class using Spring?我可以使用 Spring 注入相同的类吗?
【发布时间】:2011-07-03 17:04:43
【问题描述】:

我有一个类说 UserService,它实现了 Service 并使用 Service StereoType 进行了注释,我正在使用 Spring AOP 并希望为此做临时解决方法(I know this can be done in better way)

@Service
public class UserService implements Service{
   @Autowired
   private Service self;
}

我试过这个但得到 BeanNotFoundException,我错过了什么吗?

我知道我必须使用带有 @Configurable 的 AspectJ,但只是在寻找一些临时解决方法

【问题讨论】:

  • 这毫无意义。你期待会发生什么?
  • @skaffman 同意.. 但我想在我的 bean 中使用同一个 bean 的代理实例,以便使用 Spring AOP 进行自我调用.. 我已经提供了链接

标签: java spring


【解决方案1】:

您到底为什么需要这样做?在任何需要引用当前实例的方法中,即self,您只需使用this 关键字。

我们错过了什么吗?如果您还有其他事情要做,请尝试澄清您的问题,我们会尽力解决。

如果您想知道,这是行不通的,因为 bean 在完全构造之前无法注入 --> 这意味着 Spring 必须注入 bean 的所有属性。实际上,您所做的是创建了一个循环依赖项,因为 Spring 尝试实例化 bean,当它实例化时,它发现它需要 Autowire 另一个 bean。当它试图找到该 bean 时,它找不到,因为该 bean 尚未添加到已初始化 bean 的列表中(因为它当前正在初始化)。那有意义吗?这就是为什么您会得到 BeanNotFoundException 的原因,因为无法初始化 bean。

【讨论】:

  • @Chris-Thompson 我理解,但自调用不适用于基于 Spring 代理的 AOP 方法,我想在 AOPContext.getCurrentProxy() 旁边使用一些解决方法。我知道这不起作用但是想知道原因
  • 我知道我需要使用带有 @Configurable 的 AspectJ,但只是在寻找一些临时解决方法
  • @Premraj M 啊,我明白了。根据我的解释,你明白为什么它不起作用了吗?
  • @Chris:+1 以获得很好的解释。然而,考虑到这一限制——如何实现复合材料?请你解释一下?
  • @Nilesh,不幸的是,这不是我有很多经验的概念。您能否解释或发布一个问题并参考这个问题?
【解决方案2】:

我知道这并不能完全回答问题,但我建议您重新编写代码,这样您就不需要依赖应用于自调用的方面。例如,如果您有一些事务性方法,只需确保在调用方法中正确设置事务性内容即可。

如果您真的需要,您可以将您的课程设为ApplicationContextAware 并从上下文中获取 bean-with-aspects

【讨论】:

    【解决方案3】:

    这很好用 -

    @Service(value = "someService")
    public class UserService implements Service{
       @Resource(name = "someService")
       private Service self;
    }
    
    【解决方案4】:

    您可以将您的班级编辑为

    @Service
    @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON, proxyMode = ScopedProxyMode.INTERFACES)
    public class UserService implements Service
    {
        @Autowired
        private Service self;
    }
    

    这应该可以工作

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 1970-01-01
      • 2021-09-19
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      相关资源
      最近更新 更多