bean构造函数中的Spring Java Config引用,用于获取构造类中的其他bean

时间:2016-10-24 10:50:40

标签: spring dependency-injection spring-java-config

我已经看过其中一个程序,其中MyConfig(Spring配置文件)在其中一个bean的构造函数中被引用,以便在MyConfig中定义其他bean。 我不确定这种配置。我可以在这种代码中看到循环引用,虽然它工作正常,但我无法理解流程。它是如何工作的。下面是该代码的副本 -

@Configuration
public class MyConfig {

   @Bean(name="a")
   @Scope("prototype")
   public A getA() {
      return new A();
   }

   @Bean(name="b")
   @Scope("prototype")
   public B getB() {
      return new B();
   }

   @Bean(name="c")
   @Scope("prototype")
   public C getC() {
      return new C();
   }

   @Bean(name="queueListener")
   @Scope("singleton")
   public Queue getQueue() {
      return new Queue(MyConfig config);
   }

}

这是我的队列类 -

public class Queue implements MessageListener{

    private MyConfig config;

    public Q(MyConfig config) {
       this.config = config;
    }

    @Override
    public void onMessage() {
       createC();
    }

    public void createC() {
       C cObj = config.getC();
       cObj.setConfig(config);
       cObj.performTask();
    }
}

课程是" C"看起来像这样 -

public class C{

   private transient MyConfig config;
   private MyConfig config;

   public C() {    
   }

   public void setConfig(MyConfig config) {
      this.config = config;
   }

   public MyConfig getConfig() {
      return config;
   }

   public void performTask() {     
      A a = config.getA();  // Is it right way to get bean?
      B b = config.getB(); 
   }

} 

所以我的问题是,在另一个bean中获取bean是正确的方法吗? 返回对象真的是spring bean对象还是简单的java类对象?

我可以在上面的代码中看到循环引用原因当在MyConfig中创建Queue类的实例时,将获取MyConfig的实例/引用。 这会创建循环引用吗? 我的架构师建议我采用上述方法,而不是在Queue和class" C"这两个类中自动连接应用程序上下文。根据建筑师的背景非常沉重,这不是最佳实践。

创建bean Queue时,执行周期或调用层次结构是什么? 了解上述代码的工作将非常有帮助。

2 个答案:

答案 0 :(得分:0)

请参阅Spring Boot @Autowired creating instances on a runtime的示例 您可以看到如何正确使用单例和原型

答案 1 :(得分:0)

将配置实例注入具体bean是非常糟糕的。它使您的代码变得复杂并且使测试变得不方便,因为对于测试Queue实例,您应该以某种方式模拟整个配置。

如果要将原型bean注入单例,可以使用此处描述的技术: Howto generate prototype objects with in a singleton bean using spring java configurations