Spring Boot深度实践之自动装配( 三 )


这里我们就发现 , CachingConfigurationSelector继承了AdviceModelImportSelector , 而AdviceModelImportSelector是一个抽象类 , 其实现了ImportSelector接口 , selectImports方法为ImportSelector接口的抽象方法 , 该方法的作用是获取需要加载进Spring容器的配置类 。 正如CachingConfigurationSelector是通过实现ImportSelector方法来选择相应的配置类导入进Spring容器 , 这就是第二种装配方式—接口编程方式 。
相较于注解驱动方式 , 接口编程方式显得更为灵活 , ImportSelector方法中可通过条件判断语句实现不同配置类的引入 。
以上就是Enable模块装配的两种方式 , 接下来 , 我们来看看Spring的条件装配 。
Spring 条件装配

  • 条件装配定义
定义:Bean装配的前置判断 。
从Spring Framework 3.1 开始 , Spring允许在Bean装配进Spring容器时增加前置条件判断 。
  • 实现方式
Spring提供的条件装配实现方式有两种
  • @Profile(配置化条件装配 , Spring起始版本3.1)
  • @Conditional(编程条件装配 , Spring起始版本4.0)
先来看看@Profile是如何实现条件装配的 。
Spring中的@Profile与maven中的profile类似 , 能根据当前环境来选择性地向Spring容器注入相应的Bean 。
请看以下示例:
创建一个SpringBoot项目 , 在项目下新建TestService接口 , 代码如下
Spring Boot深度实践之自动装配
本文插图
新建Test1Service , Test2Service类 , 分别实现TestService接口
Spring Boot深度实践之自动装配
本文插图
Spring Boot深度实践之自动装配
本文插图
可以看到 , Test1Service与Test2Service均被@Profile标注 , 但value不同 , 一个为test1 , 另一个为test2 。
接着在启动类中设置profile参数 , 并从Spring容器中获取TestService的实现类对象 , 如下所示
Spring Boot深度实践之自动装配
本文插图
此时我们启动该类 , 控制台打印如下所示:
Spring Boot深度实践之自动装配
本文插图
说明此时Spring容器中TestService的实现类对象是Test1Service对象 , 当把profiles参数值改为test2时 , 启动Application , 控制台便会打印Hello World---222 , 此处不再贴图 。
上述示例标明了@Profile可做到条件装配Bean进Spring容器 。
自Spring 4.0之后 , @Profile的实现方式发生变动 , 其内部也是通过@Conditional注解来实现条件装配的;所以接下来 , 我们来看看如何使用@Conditional方式做到条件装配 。
@Conditional方式实现 , 贴上源码
Spring Boot深度实践之自动装配
本文插图
可以看到 , 它的value是一个Condition子类字节码对象 , 让我们再进到Condition中
Spring Boot深度实践之自动装配
本文插图
发现存在matches方法 , 那么这个方法就是用来判断组件是否能被注册进Spring容器 , 如果返回true , 则被@Conditional标注的组件可以被装载到Spring容器 , 反之 , 则无法注入 。
我们来简单看一个具体的源码示例 。
在Spring Boot中 , 有时需要控制配置类是否生效 , 可以使用@ConditionalOnProperty注解来控制@Configuration是否生效 。


推荐阅读