Spring-Boot 的自动配置原理

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 的自动配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值