定义AutoConfigure的顺序不起作用

时间:2018-02-18 16:35:51

标签: java spring-boot

我有一个示例项目here。在这个多模块项目中。我有模块promotion-servicePromotionConfiguration依赖于其他配置首先完成。

@Configuration @AutoConfigureAfter({RulesConfiguration.class, PointsConfiguration.class}) public class PromotionConfiguration { @Bean public PromotionService promotionService(ObjectProvider<List<Rule>> rules) { System.out.println("Adding PromotionService to context"); List<Rule> ruleList = rules.getIfAvailable(); if (!ruleList.isEmpty()) { ruleList.sort(Comparator.comparingInt(Rule::getOrder)); } return new PromotionServiceImpl(ruleList); } }

但是当具有模块promotion-service依赖关系的spring boot应用程序在促销服务之后被添加到上下文中

2018-02-18 11:20:26.743 INFO 11582 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] Adding PromotionService to context Adding PointRule to context. Adding PromotionRule to context. 2018-02-18 11:20:27.087 INFO 11582 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@196a42c3: startup date [Sun Feb 18 11:20:25 EST 2018]; root of context hierarchy

1 个答案:

答案 0 :(得分:2)

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

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

你不应该太担心运行时部分,上下文可以根据其优化计划自由调用必要的工厂方法(即@Bean注释方法)(它可以解决周期的智能问题)

您获得此日志输出的原因是您没有要求上下文解析Rule bean。 ObjectProvider是一个代理,除非您要求某些内容(getAvailable),否则不会执行任何操作。

我已将注入点更改为使用List<Rule>,我得到以下内容:

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

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