互斥的bean加载

Mutally exclusive bean loading

我正在使用 spring-boot 并希望根据传递的配置文件有条件地加载两个 bean。

@Configuration
@Profile("secure")
public class Secured ... //this should only load when "secure" is supplied

@Configuration
public class NotSecured ... //this should be the default

所以基本上:

如果用户通过 --spring.profiles.active=secured 我希望加载 Secured bean 但不加载 NotSecured bean。默认情况下,它应该只加载 NotSecured bean。

这可能吗?

您可以使用 '!' not 运算符,即用 @Profile("!secure") 注释 Bean/Configuration class 并且它仅在 'secure' 配置文件未激活时使用。

您还可以使用此注释明确指定默认配置文件设置:

  • @Profile("default")
  • 或类似 @Profile({"insecure","default"}
  • 的值

值得注意的是,任何未指定配置文件的 bean 都属于默认配置文件

令我惊讶的是,如果您对一项服务有多个实现,并且其中一个用 @Primary@Profile(...) 注释,则将注入具有 默认配置文件的 bean 如果配置文件 配置( 配置示例 applications.properties: spring.profiles.active=val1,val2,...).

换句话说,当在任何实现中使用 @Profile 时,似乎不会考虑 @Primary 注释;如果没有定义配置文件,将使用 default(这可能是没有 @Profile 注释的实现,因为它成为默认值!)。

<!-- Tested for -->
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>