Spring:如何确保bean注册到容器的顺序?
我有一组服务类,它们分布在我的应用程序中的不同maven模块中Spring:如何确保bean注册到容器的顺序?,spring,Spring,我有一组服务类,它们分布在我的应用程序中的不同maven模块中 public class ServiceA implements IsService { public void startA() { .... } } public class ServiceB implements IsService { public void startB() { .... } } 创建配置类以仅检测和注册实现IsService接口的类 @C
public class ServiceA implements IsService
{
public void startA()
{
....
}
}
public class ServiceB implements IsService
{
public void startB()
{
....
}
}
创建配置类以仅检测和注册实现IsService接口的类
@Configuration
@ComponentScan(basePackages = {"com.subex.roc"} ,
useDefaultFilters = false ,
includeFilters = {@Filter(type = FilterType.ASSIGNABLE_TYPE,value = IsService.class)})
public class ServiceRegisterConfig
{
}
获取注册的类并以多态方式调用start()
public void initServerServices()
{
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(ServiceRegisterConfig.class);
context.refresh();
for (String beanDfn : context.getBeanDefinitionNames())
{
if (context.getBean(beanDfn) instanceof IsService) {
IsService service = (IsService) context.getBean(beanDfn);
service.start();
}
}
}
但是,我想确保首先调用ServiceA的start(),然后调用ServiceB,因为ServiceB依赖于ServiceA的初始化。容器能否确保这一点
我试过戴彭森。但是服务的开始()是按照它们在类路径中遇到的顺序被调用的。DependsOn不被尊重。使用
取决于
属性,但是如果你遇到麻烦,你总是可以在后处理器工厂进行黑客攻击
public class PreInitializer implements BeanFactoryPostProcessor, PriorityOrdered {
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
/* put initialization code here */
}
}
BeanFactoryPostProcessor
可用于设置依赖项
public class DependencyConfigurer implements BeanFactoryPostProcessor, PriorityOrdered {
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition bd = beanFactory.getBeanDefinition("serviceB");
bd.setDependsOn("serviceA");
}
}
或者,您可以使用DependsOn
annotation
@Bean(name="ServiceA")
public class ServiceA implements IsService
{
public void startA()
{
....
}
}
@Bean(name="ServiceB")
@DependsOn("ServiceA")
public class ServiceB implements IsService
{
public void startB()
{
....
}
}
最后可以使用XML配置
<bean class="com.foo.ServiceA" name="serviceA"/>
<bean class="com.foo.ServiceB" depends-on="serviceA"/>
实现PriorityOrdered的可能重复意味着我必须去更新服务类。我正在寻找一个解决方案,我可以在外部定义此顺序。depends-on似乎可行。depends-on是否有基于java或基于批注的替代方案?@Priyanka.Patil您可以使用DependsOn
批注on您的bean的声明。但在这种情况下,您必须在配置类中手动声明每个bean。但是服务的开始()是按照它们在类路径中遇到的顺序被调用的。DependsOn
不被尊重。@DependsOn
可以在@configuration
注释类中使用吗(该类将有一个服务类声明列表)而不是@bean
带注释的类。您希望这样做的原因是什么?希望保持服务类没有依赖关系管理。xml配置也是一个选项。更新了我的帖子。BeanFactory后处理器可以为您工作。