Spring-Boot 的自动配置原理
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。当我们使用IDEA工具创建SpringBoot 项目的时候,在项目中会生成一个全局的配置文件application.properties或 application.yml,我们各种属性设置都在这个文件中去配置,比如:应用名称(spring.application.name)端口号(server.port)等等一系列的配置,那们当我们启动SpringBoot 项目这些配置就都生效了,那是这么做到的呢?接下来我们来唠唠SpringBoot 的自动配置原理。
核心注解
@SpringBootApplication 标记这个类是 SpringBoot的主配置类,这个注解里面,最主要的就是@EnableAutoConfiguration开启自动配置
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
// 略
}
在@EnableAutoConfiguration注解内使用到了@import注解来完成导入配置的功能,而EnableAutoConfigurationImportSelector内部则是使用了pringFactoriesLoader.loadFactoryNames方法进行扫描具有META-INF/spring.factories文件的jar包,重点转移到META-INF/spring.factories。
扫描
我们以mybatis为例,读取 到META-INF/spring.factories文件如下:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration,\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
EnableAutoConfiguration注解定位到MybatisAutoConfiguration类,即自动配置类。
自动配置类
MybatisAutoConfiguration类
@org.springframework.context.annotation.Configuration 标记此类为配置类
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class) 关联一个配置属性类
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })
public class MybatisAutoConfiguration implements InitializingBean {
....
@Bean//自动配置了SQLSessionFactoryBean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
...
}
通过源码看出,其中的DataSource是SpringBoot配置文件中配置的,通过SqlSessionFactoryBean构造器参数注入,返回SqlSessionFactory,实现Mybatis在Spring中快速集成。这时还有个配置属性类MybatisProperties用于加载属性。
spring:
datasource:
url: jdbc:mysql://localhost:3306/rocket
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
配置属性类
配置属性类有前缀,能够将外化配置直接转化为Java类的属性
@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)//前缀
// 外化配置的内容与java属性的对应方式,前缀.属性名 mybatis.mapper-location
public class MybatisProperties {
public static final String MYBATIS_PREFIX = "mybatis";
private static final ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
/**
* Location of MyBatis xml config file.
*/
private String configLocation;
/**
* Locations of MyBatis mapper files.
*/
private String[] mapperLocations;
mybatis:
mapper-locations: classpath:mappers/**/*.xml //xml配置路径
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-aliases-package: com.woniuxy.boot.bootdemo.model
这就完成了Spring-Boot 的自动配置。