Spring:如何确保bean注册到容器的顺序?

Spring:如何确保bean注册到容器的顺序?,spring,Spring,我有一组服务类,它们分布在我的应用程序中的不同maven模块中 public class ServiceA implements IsService { public void startA() { .... } } public class ServiceB implements IsService { public void startB() { .... } } 创建配置类以仅检测和注册实现IsService接口的类 @C

我有一组服务类,它们分布在我的应用程序中的不同maven模块中

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后处理器可以为您工作。