我有一个示例项目here。在这个多模块项目中。我有模块promotion-service
,PromotionConfiguration
依赖于其他配置首先完成。
@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
答案 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
结束。