关于以下代码:
加载 Bean1 时,如何确定 Bean2 已加载?假设我无法将 Bean2 声明移至 ServicesConfig1
我测试了它并且 ApplicationContext 不是 NULL ,但我只是想确保它没有以随机顺序加载,所以我的测试现在下次通过会失败。
˚F
@Configuration
public class ServicesConfig1
{
@Inject
private ApplicationContext ctx;
@Bean
public Bean1 bean1()
{
Bean2 bean2 = ctx.getBean(Bean2.class);
....
}
}
@Configuration
public class ServicesConfig2
{
@Bean
public Bean2 bean2()
{
return new Bean2();
}
}
答案 0 :(得分:0)
您根本不需要在这里注入ApplicationContext
。
将ApplicationContext
视为更具容器特定的bean,它允许对bean生命周期进行更细粒度的控制,并且在大多数情况下您不需要。
对于具体案例,您可以使用简单的依赖注入。
@Configuration
public class ServicesConfig1{
@Bean
public Bean1 bean1(Bean2 bean2){
....
}
}
@Configuration
public class ServicesConfig2 {
@Bean
public Bean2 bean2() {
return new Bean2();
}
}
通过将bean2
作为参数传递给bean1
,您向DI容器发出信号,要构建它,您依赖于bean2
,因此容器将查看bean2
已经被实例化了,如果没有,它会创建它,然后为你注入它。
答案 1 :(得分:-1)
您可以使用@DependsOn
@Configuration
public class ServicesConfig1
{
@Inject
private ApplicationContext ctx;
@Bean
@DependsOn(value = "Bean2")
public Bean1 bean1()
{
Bean2 bean2 = ctx.getBean(Bean2.class);
....
}
}
@Configuration
public class ServicesConfig2
{
@Bean
public Bean2 bean2()
{
return new Bean2();
}
}
更好的解决方案是将Bean2
作为bean1函数的参数。这样spring将初始化并将其注入到您的函数中。
@Bean
public Bean1 bean1(Bean2 bean2)
{
...
}