Spring Boot#AutoConfigure

  • Post author:
  • Post category:其他



发博词

记得刚开始使用各种基于springboot的autoconfigure构建的第三方的框架或者中间件的时候,惊艳到爆了。今天有时间正好分析一下这块。


Spring Framework#Spring Context

相信有一部分人跟我一样,是在使用spring boot的时候接触到autoconfigure这种风格的配置的,但其实这并不是spring boot才有的,从spring framework3.1开始,这个特性就有了,像@EnableAspectJAutoProxy、@EnableAsync都是从spring 3.1开始就有了。org.springframework.context.annotation包下面拥有自动配置的所有的相关的基础设施。


基础设施

org.springframework.context.annotation包下面提供了各种基于注解配置的基础设施:

1. @Profile:可跟@Bean配合、

2. @Bean、@Scope、@DependsOn、@Primary、@Lazy、@Role、@Description:

3. @Conditional、Condition:@Conditional注解标识在类或者方法上,标识在方法上,符合条件,创建该方法的返回值类型的Bean;标识在类上,符合条件全部创建。

4. @Import(@ImportResource):

5. @Configuration表示的Class(@EnableLoadTimeWeaving)、ImportSelector接口实现(@EnableAsync)或者ImportBeanDefinitionRegistrar接口实现(@EnableAspectJAutoProxy)

6. ImportSelector、DeferredImportSelector:

7. ImportRegistry

8. ImportBeanDefinitionRegistrar:用来手动注册bean定义的, 可以实现类似于Mybatis-Spring提供的扫描Mapper接口并注册其bean定义, 事实上@MapperScan注解就@Import了MapperScannerRegistrar这个类, 而这个类实现了上面的接口, 来扫描Mapper并注册bean定义.再多说点吧, Spring解析Java配置类的时候, 会判断类是不是标注了@Import注解, 然后会判断, 如果Import注解的value是ImportBeanDefinitionRegistrar类型, 会存到一个变量, 后面初始化bean工程完成后, 会回调ImportBeanDefinitionRegistrar.

9. @Configuration:跟@Controller、@Servcice和@Repository是一样的套路,都用@Component注解了,作为特定类型的组件

10. @PropertySource

11. Condition、ConfigurationCondition、@Conditional


spring boot autoconfigure

Spring Boot AutoConfigure替代了XML风格的配置文件,带来了前所未有的体验。Spring Boot AutoConfigure模块基于Spring Framework和Spring Boot提供的基础设施,构建类配置Bean+属性文件配置行为的配置方式,Java类配置Bean为我们提供了更好的编程体验,属性文件配置行为的方式使这种方式拥有跟XML外部配置文件配置方式同样的灵活性。


org.springframework.boot.autoconfigure

首先,Spring Boot AutoConfigure在Spring Framework和Spring Boot提供的基础设施上做了很多的扩展工作:

1. 顺序控制:AutoConfigureOrder、AutoConfigureAfter、AutoConfigureBefore;

2. AutoConfigurationPackage:在spring boot mian class上标识EnableAutoConfiguration之后,所有子包下面的spring 组件都能被扫描到,就是这个注解的能力;

3. EnableAutoConfiguration/ImportAutoConfiguration:EnableAutoConfiguration开启自动配置,自动应用spring.factories中配置的哥哥*AutoConfiguration;ImportAutoConfiguration跟EnableAutoConfiguration相比,只是没有自动配置的功能,给ImportAutoConfiguration传入谁的AutoConfiguration就应用谁的,单元测试等的场景用到的比较多;

4. 其他的一些工具类,过滤器之类的东西大家可以自己去看下


org.springframework.boot.autoconfigure.context.condition

  1. ConditionalOnCloudPlatform:是否在云环境下,spring boot cloud模块提供了两种实现,CLOUD_FOUNDRY和HEROKU,国内应该用不到这个注解了
  2. ConditionalOnJava:指定的Java版本
  3. ConditionalOnWebApplication:是Web环境的时候
  4. ConditionalOnNotWebApplication:不是web环境的时候
  5. ConditionalOnJndi:JNDI环境下使用
  6. ConditionalOnClass:classpath中存在某个类
  7. ConditionalOnMissingClass:classpath中不存在某个类
  8. ConditionalOnBean:BeanFactory中存在某个类的Bean
  9. ConditionalOnMissingBean:BeanFactory中不存在某个类的Bean
  10. ConditionalOnExpression:SpEL的结果
  11. ConditionalOnProperty:Environment中是否有某个属性的配置信息
  12. ConditionalOnResource:classpath中是否存在指定名称的资源
  13. ConditionalOnSingleCandidate:指定的类在BeanFactory中只有一个候选的bean,或者有多个候选的bean,但是其中一个指定了primary时


各种*AutoConfiguration的实现:

所有的*AutoConfiguration的具体实现包括两部分,一个是标识了@Configuration注解的配置类,另一个是Property文件。有些模块比较复杂,像security的oauth2模块,主要文件也是这两类,剩下的是一些工具。

*AutoConfiguration也是Configuration,被@Configuration注解,只不过spring boot autoconfigure模块内置的 *AutoConfiguration被配置到了 spring.factories文件中,启动的时候自动配置。

参考:


SpringBoot之@EnableAutoConfiguration原理及自定义扩展



Spring4.0系列5-@Conditional


转载于:https://my.oschina.net/xiaominmin/blog/1791599