Java 定义自动配置不工作的顺序

Java 定义自动配置不工作的顺序,java,spring-boot,Java,Spring Boot,我有一个范例项目。在这个多模块项目中。我有一个模块促销服务,促销配置依赖于首先完成的其他配置 @配置 @AutoConfigureAfter({RulesConfiguration.class,PointsConfiguration.class}) 公共类升级配置 { @豆子 公共促销服务促销服务(ObjectProvider规则) { System.out.println(“向上下文添加PromotionService”); List ruleList=rules.getIfAvailabl

我有一个范例项目。在这个多模块项目中。我有一个模块
促销服务
促销配置
依赖于首先完成的其他配置


@配置
@AutoConfigureAfter({RulesConfiguration.class,PointsConfiguration.class})
公共类升级配置
{
@豆子
公共促销服务促销服务(ObjectProvider规则)
{
System.out.println(“向上下文添加PromotionService”);
List ruleList=rules.getIfAvailable();
如果(!ruleList.isEmpty())
{
排序(Comparator.comparingit(Rule::getOrder));
}
返回新的PromotionServiceImpl(规则列表);
}
}

但是,当spring引导应用程序依赖于模块
升级服务时,规则将在升级服务启动后添加到上下文中


2018-02-18 11:20:26.743信息11582---[ost-startStop-1]o.s.b.w.servlet.FilterRegistrationBean:将筛选器:“requestContextFilter”映射到:[/*]
将PromotionService添加到上下文
将PointRule添加到上下文。
将升级规则添加到上下文。
2018-02-18 11:20:27.087信息11582---[main]s.w.s.m.a.RequestMappingHandlerAdapter:正在寻找@ControllerAdvice:org.springframework.boot.context.embedded。AnnotationConfigEmbeddedWebApplicationContext@196a42c3:启动日期[美国东部时间2018年2月18日星期日11:20:25];上下文层次结构的根

解析配置及其结构与在运行时有效地创建bean之间存在差异。这里的具体问题是什么

如果我运行您的项目,
promotionService
将按照您预期的两条规则创建。如果我在
promotionService
上添加
@ConditionalOnMissingBean(Rule.class)
,则不会创建它(这证明上下文知道至少要创建一个
Rule
bean)

您不必太担心运行时部分,上下文可以根据其优化计划(即,它可以使用智能工具解析循环)自由调用必要的工厂方法(即
@Bean
注释方法)

获得此日志输出的原因是,您没有要求上下文解析
规则
bean
ObjectProvider
是一个代理,在您请求某些内容之前不会执行任何操作(
getAvailable

我已将注入点更改为使用
List
,并获得以下信息:

Adding PointRule to context.
Adding PromotionRule to context.
Adding PromotionService to context

所以一切都很好。但是,请重命名您的自动配置,以便它们以
自动配置
结束,而不是
配置

解析配置及其结构与在运行时有效创建bean之间存在差异。这里的具体问题是什么

如果我运行您的项目,
promotionService
将按照您预期的两条规则创建。如果我在
promotionService
上添加
@ConditionalOnMissingBean(Rule.class)
,则不会创建它(这证明上下文知道至少要创建一个
Rule
bean)

您不必太担心运行时部分,上下文可以根据其优化计划(即,它可以使用智能工具解析循环)自由调用必要的工厂方法(即
@Bean
注释方法)

获得此日志输出的原因是,您没有要求上下文解析
规则
bean
ObjectProvider
是一个代理,在您请求某些内容之前不会执行任何操作(
getAvailable

我已将注入点更改为使用
List
,并获得以下信息:

Adding PointRule to context.
Adding PromotionRule to context.
Adding PromotionService to context

所以一切都很好。但是,请重命名您的自动配置,使其以
自动配置
结尾,而不是
配置

谢谢,这就解决了问题。我需要解析上下文,因为在将其传递给
PromotionService
implementation之前需要进行排序。Nicholas,它不是这样工作的。您不需要对bean定义进行排序来获得该结果。标准注入机制足以教会上下文如何创建/加载内容。订单对条件评估很重要。是的,对不起,订单对spring不重要。但是当我的代码被执行时,首先运行正确的规则是很重要的,这就是我要说的。只要您的配置结构合理,就不需要排序规则。
ApplicationContext
会自己解决这个问题(虽然给它适当的提示显然更好。明白了。谢谢你的帮助谢谢,这就解决了它。我需要在将上下文传递给
PromotionService
实现之前进行排序来解析它。Nicholas,这不是它的工作方式。你不需要命令bean定义解析来获得结果。标准inje动作机制足以教会上下文如何创建/加载内容。顺序对于条件评估很重要。是的,对不起,顺序对spring并不重要。但对于我的代码执行时,首先运行正确的规则很重要。这就是我要说的。只要您确认配置结构是合理的。
ApplicationContext
自行解决了这一问题(尽管给出适当的提示显然更好。明白了。谢谢您的帮助