我见过一个程序,其中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被创建时,执行周期或调用层级是怎样的?
将配置实例注入到一个特定的Bean中是一个非常糟糕的想法。它使你的代码复杂化,并且使测试不方便,因为为了测试队列实例,你应该以某种方式模拟整个配置。
如果你想把一个原型Bean注入到单体中,你可以使用这里描述的一种技术。如何使用spring java配置在singleton bean中生成原型对象。
请看下面的例子 Spring Boot @Autowired在运行时创建实例。你可以看到如何正确使用单例和原型。