[英]How to ensure a set of Spring boot beans implementing an interface being first initalized before their container being initalized?
我有一组 bean 都实现了一个接口
@Componet
class BeanA implements interfaceA{
public void process(){
}
}
@Componet
class BeanB implements interfaceA{
public void process(){
}
}
我想获取 interfaceA 的所有 beans 并按顺序应用它们的 process 方法,因此我有一个容器来收集这些 beans。
@Componet
class Container{
List<interfaceA> container;
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void init()
{
container=applicationCOntext.getBeansOfType(interfaceA.class).values().stream().collect(Collections.list());
for(obj:container){
obj.process();
}
}
那么如何确保在interfaceA的所有bean之后初始化Container,以便我可以在Container的init()方法中获取interfaceA的所有bean?
或者换个说法,applicationContext.getBeansOfType 能不能一直获取interfaceA的所有bean? 如果 Container 先初始化呢?
顺便说一下,Container 不必是一个组件。
您可以注入一个包含所有实现interfaceA
的组件的列表:
@Componet
class Container{
@Autowired
List<interfaceA> container;
@PostConstruct
public void init()
{
for(obj : container){
obj.process();
}
}
}
在这种情况下,您无需担心组件创建顺序,Spring 足够聪明,可以使它正确。
组件扫描/初始化是一个两步过程。 首先,Spring 收集所有 bean 定义并构建一个依赖关系图(不创建任何 bean)。 之后,它知道应该以什么顺序初始化 bean。 当您将interfaceA
bean 作为列表注入时,Spring 知道, Container
实例依赖于它们,并将首先初始化它们。 如果您从ApplicationContext
手动获取组件(依赖项将被隐藏),则情况并非如此,并且您需要在interfaceA
组件上添加 @DependsOn 注释。
您可以在Container
类上使用@DependsOn(value = {"beanA", "beanB"})
。
并使您的Container
类实现InitializingBean
接口并覆盖afterPropertiesSet()
方法。
然后将您在init
方法中编写的逻辑移动到afterPropertiesSet()
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.