@Profile 到底怎么选?默认 profile 什么时候失效?自定义 @Conditional 为什么会随配置类顺序变化?类上和方法上的条件有什么区别?这篇在 Spring Framework 7.0.9 上把条件装配的几个坑逐个跑出来。
什么都不激活:激活 [],默认 [default] → [always, notProd, onlyDefault] setActiveProfiles(dev):激活 [dev],默认 [default] → [always, dev, devNotCloud, notProd] setActiveProfiles(prod):激活 [prod],默认 [default] → [always, prod, prodOrCloud] setActiveProfiles(dev, cloud):激活 [dev, cloud],默认 [default] → [always, dev, notProd, prodOrCloud] -Dspring.profiles.active=dev:激活 [dev],默认 [default] → [always, dev, devNotCloud, notProd] setDefaultProfiles(base),没有激活:激活 [],默认 [base] → [always, notProd]
没有激活时用 default;激活了别的 profile,default 就不再生效;支持 &、|、! 表达式。
注册顺序 [User, FallbackBean] → [dataSource]
· MissingDs(REGISTER_BEAN 阶段)被求值:registry 里已有 dataSource = true
注册顺序 [FallbackBean, User] → [dataSource, fallbackDs]
· MissingDs(REGISTER_BEAN 阶段)被求值:registry 里已有 dataSource = false“缺失才注册”类的条件依赖配置类的注册顺序。
注册顺序 [User, FallbackParse] → [dataSource, fallbackDsParse]
· MissingDsParse(PARSE_CONFIGURATION 阶段)被求值:registry 里已有 dataSource = false
· MissingDsParse(PARSE_CONFIGURATION 阶段)被求值:registry 里已有 dataSource = false
注册顺序 [FallbackParse, User] → [dataSource, fallbackDsParse]
· MissingDsParse(PARSE_CONFIGURATION 阶段)被求值:registry 里已有 dataSource = false
· MissingDsParse(PARSE_CONFIGURATION 阶段)被求值:registry 里已有 dataSource = false类上的 ConfigurationCondition 在解析阶段求值,看不到 @Bean 方法注册的定义。
类上 @Conditional(false)、方法上 @Conditional(false) 之后剩下 → [keep]
类上的 @Conditional 一次跳过整个类及其 @Import 与嵌套配置类。