1. 模块装配考虑不到的地方
还是拿上一章的酒馆为例。如果这套代码模拟的环境放到一片荒野,那这个时候可能吧台还在,老板还在,但是调酒师肯定就不干活了(荒郊野外哪来那些闲情雅致的人去喝酒呢),所以这个时候调酒师就不应该注册到 IOC 容器了。这种情况下,如果只是模块装配,那就没办法搞定了:只要配置类中声明了 @Bean 注解的方法,那这个方法的返回值就一定会被注册到 IOC 容器成为一个 Bean 。
所以,有没有办法解决这个问题呢?当然是有(不然咱这一章讲个啥呢),先来学习第一种方式:Profile 。
2. Profile
2.1 什么是Profile
@Profile 注解可以标注一些组件,当应用上下文的一个或多个指定配置文件处于活动状态时,这些组件允许被注册。 配置文件是一个命名的逻辑组,可以通过 ConfigurableEnvironment.setActiveProfiles 以编程方式激活,也可以通过将 spring.profiles.active 属性设置为 JVM 系统属性,环境变量或 web.xml 中用于 Web 应用的 ServletContext 参数来声明性地激活,还可以通过 @ActiveProfiles 注解在集成测试中声明性地激活配置文件。
简单理解下这段文档注释的意思:@Profile 注解可以标注在组件上,当一个配置属性(并不是文件)激活时,它才会起作用,而激活这个属性的方式有很多种(启动参数、环境变量、web.xml 配置等)。
2.2 @Profile的使用
3.Conditional
3.1 什么是Conditional
被 @Conditional 注解标注的组件,只有所有指定条件都匹配时,才有资格注册。条件是可以在要注册 BeanDefinition 之前以编程式确定的任何状态。 @Conditional 注解可以通过以下任何一种方式使用:
- 作为任何直接或间接用 @Component 注解的类的类型级别注解,包括 @Configuration 类
- 作为元注解,目的是组成自定义注解
- 作为任何 @Bean 方法上的方法级注解
如果 @Configuration 配置类被 @Conditional 标记,则与该类关联的所有 @Bean 的工厂方法,@Import 注解和 @ComponentScan 注解也将受条件限制。
简单理解下这段文档注释:@Conditional 注解可以指定匹配条件,而被 @Conditional 注解标注的 组件类 / 配置类 / 组件工厂方法 必须满足 @Conditional 中指定的所有条件,才会被创建 / 解析。
下面咱改造上面提到的场景,来体会 @Conditional 条件装配的实际使用。