我试图通过从appContext.getBeanDefinitionNames()
检索来调用一组bean的操作。调用操作的顺序对我来说很重要,因为一个bean的操作依赖于其他操作。
我已尝试以下设置此顺序。
1.PriorityOrdered interface
2.@DependsOn annotation
3.BeansPostProcessor interface
但它们似乎都没有影响列表中的顺序。默认情况下,它按照类路径中遇到它们的顺序返回bean。
两个问题。
1.当上述方法将初始化顺序设置为bean时,这意味着什么?
2.可以以任何方式影响使用appContext.getBeanDefinitionNames()检索bean名称的顺序吗?
答案 0 :(得分:0)
我从你的问题中无法理解你的问题究竟是什么。是否要更改初始化bean的顺序或者按照在配置中定义的顺序获取bean的名称?
1.当上述方法将初始化顺序设置为bean时,这意味着什么?
ApplicationContext
负责实例化,配置和连接应用程序的bean。 ApplicationContext
在其生命周期的早期阶段读取您的配置(XML,注释,Java代码配置等)并实例化这些bean。当我们讨论初始化bean的顺序时,我们指的是ApplicationContext
将更快地实例化哪个bean,以及稍后将实例化的bean。例如,如果您有两个类A
和B
,其中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 强>
PriorityOrdered是Ordered界面的扩展。来自文档:
Ordered是一个可以由应该实现的对象实现的接口 可以订购,例如在收藏中。实际的顺序可以是 解释为优先级,与第一个对象(最低的 订单价值)具有最高优先级。
请注意,此界面还有一个优先级标记: PriorityOrdered。由PriorityOrdered对象表示的订单值 始终在普通订单表示的相同订单值之前应用 对象。
来自PriorityOrdered
扩展
Ordered
接口,表示优先级排序: 由PriorityOrdered
个对象表示的订单值始终适用 由普通有序对象表示的相同顺序值。这是 主要是一个专用接口,用于它所在的对象 特别重要的是首先识别优先对象,而不是 甚至获得剩余的物体。一个典型的例子:优先 Spring中的后处理器ApplicationContext
。
此外,我认为你也无法从这个界面实现你想要的东西。
2.可以以任何方式影响使用appContext.getBeanDefinitionNames()检索bean名称的顺序吗?
getBeanDefinitionNames()
方法只返回一个字符串数组,其中包含当前工厂(Docs)中定义的所有bean的名称。