影响ApplicationContext.getBeanDefinitionNames()返回的顺序的方法?

时间:2016-03-28 09:53:16

标签: spring

我试图通过从appContext.getBeanDefinitionNames()检索来调用一组bean的操作。调用操作的顺序对我来说很重要,因为一个bean的操作依赖于其他操作。

我已尝试以下设置此顺序。

1.PriorityOrdered interface
2.@DependsOn annotation
3.BeansPostProcessor interface 

但它们似乎都没有影响列表中的顺序。默认情况下,它按照类路径中遇到它们的顺序返回bean。

两个问题。

1.当上述方法将初始化顺序设置为bean时,这意味着什么?

2.可以以任何方式影响使用appContext.getBeanDefinitionNames()检索bean名称的顺序吗?

1 个答案:

答案 0 :(得分:0)

我从你的问题中无法理解你的问题究竟是什么。是否要更改初始化bean的顺序或者按照在配置中定义的顺序获取bean的名称?

1.当上述方法将初始化顺序设置为bean时,这意味着什么?

ApplicationContext负责实例化,配置和连接应用程序的bean。 ApplicationContext在其生命周期的早期阶段读取您的配置(XML,注释,Java代码配置等)并实例化这些bean。当我们讨论初始化bean的顺序时,我们指的是ApplicationContext将更快地实例化哪个bean,以及稍后将实例化的bean。例如,如果您有两个类AB,其中B依赖于A,如下所示:

class A {
}

class B {

   private A a;

   public B(A a) {
      this.a = a;
   }

}

正如您所见,为了实例化B,我们需要一个A的实例。

<强> DependsOn

当前bean所依赖的Bean。指定的任何bean都保证在此bean之前由容器创建。 (DependsOn Documentation

<强>的BeanPostProcessor

BeanPostProcessor允许您在容器实例化之后修改过。我不认为你可以通过bean后处理器实现你想要的东西。 Docs

<强> PriorityOrdered

PriorityOrderedOrdered界面的扩展。来自文档:

  

Ordered是一个可以由应该实现的对象实现的接口   可以订购,例如在收藏中。实际的顺序可以是   解释为优先级,与第一个对象(最低的   订单价值)具有最高优先级。

     

请注意,此界面还有一个优先级标记:   PriorityOrdered。由PriorityOrdered对象表示的订单值   始终在普通订单表示的相同订单值之前应用   对象。

来自PriorityOrdered

的文档
  

扩展Ordered接口,表示优先级排序:   由PriorityOrdered个对象表示的订单值始终适用   由普通有序对象表示的相同顺序值。这是   主要是一个专用接口,用于它所在的对象   特别重要的是首先识别优先对象,而不是   甚至获得剩余的物体。一个典型的例子:优先   Spring中的后处理器ApplicationContext

此外,我认为你也无法从这个界面实现你想要的东西。

2.可以以任何方式影响使用appContext.getBeanDefinitionNames()检索bean名称的顺序吗?

getBeanDefinitionNames()方法只返回一个字符串数组,其中包含当前工厂(Docs)中定义的所有bean的名称。