我已经看过其中一个程序,其中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时,执行周期或调用层次结构是什么? 了解上述代码的工作将非常有帮助。
答案 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