在Bean构造函数中引用Spring Java Config来获取构造类中的其他Bean。

问题描述 投票:0回答:2

我见过一个程序,其中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类对象?

我可以在上面的代码中看到循环引用,因为当Queue类的实例将在MyConfig中被创建时,将采取MyConfig的实例引用,这将创建循环引用吗?我的架构师建议我采用上述方法,而不是在Queue和 "C "类中自动布线应用上下文。根据架构师的说法,上下文是非常沉重的,这不是最好的做法。

当Bean Queue被创建时,执行周期或调用层级是怎样的?

spring dependency-injection spring-java-config
2个回答
1
投票

将配置实例注入到一个特定的Bean中是一个非常糟糕的想法。它使你的代码复杂化,并且使测试不方便,因为为了测试队列实例,你应该以某种方式模拟整个配置。

如果你想把一个原型Bean注入到单体中,你可以使用这里描述的一种技术。如何使用spring java配置在singleton bean中生成原型对象。


0
投票

请看下面的例子 Spring Boot @Autowired在运行时创建实例。你可以看到如何正确使用单例和原型。

© www.soinside.com 2019 - 2024. All rights reserved.