spring-boot-starter原理

一、前言

mybatis-spring-boot-starter是什么?

mybatis-spring-boot-starter可以帮助你快速创建基于Spring Boot的MyBatis应用程序。

mybatis-spring-boot-starter可以达到什么效果?

● 构建独立的MyBatis应用程序
● 零模板
● 更少的XML配置文件

SpringBoot-starter自动配置

SpringBoot拥有很多方便使用的starter,比如spring-boot-starter-log4j、mybatis-spring-boot-starter.jar等,各自都代表了一个相对完整的功能模块。

官方:spring-boot-starter-xxx
民间:xxx-spring-boot-starter

开启自动配置
@SpringBootApplication => @EnableAutoConfiguration

SpringBoot搭建

我们使用SpringBoot新建一个有mybatis的web工程,看看他的依赖都有哪些:

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>
        <!--pageHelper-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
        </dependency>

使用SpringBoot-starter来搭建web工程相当方便,不像之前搭建SSM,需要将那么多jar包依赖逐个加入到Maven工程,还需考虑jar包之间的版本兼容性等。

mybatis配置

引入mybatis-spring-boot-starter模块之后,其可以:

● 自动检测DataSource
● 使用SqlSessionFactoryBean注册SqlSessionFactory 实例,并设置DataSource数据源
● 基于SqlSessionFactory自动注册SqlSessionTemplate实例
● 自动扫描@Mapper注解类,并通过SqlSessionTemplate注册到Spring Context中

mybatis-spring-boot-starter就是参照Spring Boot的设计思想,化繁为简,以简单注解的方式让用户快速上手。
mybatis配置所需要

  1. 依赖
  2. 配置文件 data.properties
  3. 配置类
    a. 数据源
    b. 事务管理器
    c. SqlSessionFactoryBean
    mybatis-spring-boot-starter
    • 传递依赖 mybatis以及mybatis-spring 简化依赖

mybatis-spring-boot-starter解析

mybatis-spring-boot-starter中最主要的一个类就是MybatisAutoConfiguration,MybatisAutoConfiguration 是spring boot 下 mybatis 默认的配置类,只要开启了注释了 @EnableAutoConfiguration 就可以了,spring boot 就会执行。在SpringBoot启动的过程中 @SpringBootApplication 中组合了 EnableAutoConfiguration ,属于spring boot 自动配置和启动过程,SpringBoot启动时会进入到MybatisAutoConfiguration这个类里,这是一个自动配置类,这里面初始化了SqlSessionFactory、SqlSessionTemplate等一些我们在Spring项目中需要手动配置。
mybatis-spring-boot-starter所用到注解

  • Configuration注解:说明这是spring的配置项,容器初始化的时候要进行解析处理ConditionalOnClass注解:有类SqlSessionFactory(Mybatis),SqlSessionFactoryBean(Mybatis-Spring)的时候才进行解析处理
    ConditionalOnBean:容器中有DataSource Bean的时候才进行解析处理
    AutoConfigureAfter注解: 在DataSourceAutoConfiguration后解析
    EnableConfigurationProperties注解和MybatisProperties类:配置自己的Mybatis 属性,在Application.Properties中。

spring-boot-starter原理:

扫描,读取 META-INF/spring.factories
必须在classpath下的META-INF文件夹下创建一个spring.factories,本质是一个Properties,所以得按照key-value的形式进行配置。自动配置的key是org.springframework.boot.autoconfigure.EnableAutoConfiguration。mybatis的配置:


# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration,\
org.mybatis.spring.boot.autoconfigure.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 {
        
        ...
        }

通过自动配置类,定位配置属性类,配置属性类有前缀,能够将外化配置直接转化为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;

例子:

  1. 创建 kuaidiniao项目,quickstart项目
  2. 添加功能
  3. 安装到本地
  4. 创建kuaidiniao-spring-boot-starter 项目,quickstart项目
  5. 在resources目录下添加META-INF/spring.factories文件,内容指向KuaidiniaoAutoConfiguration
  6. 编写KuaidiniaoAutoConfiguration
  7. 编写配置属性类
  8. 安装kuaidiniao-spring-boot-starter
  9. 在项目中导入,并使用
package com.woniuxy.tool.config;
import com.woniuxy.tool.ExprsTrackConfig;
import com.woniuxy.tool.KuaiDiNiaoQueryAPI;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration//标记配置类
@EnableConfigurationProperties(KuaidiniaoProperties.class)//关联一个属性类
public class KuaidiniaoAutoConfiguration {
    //外化配置读入该配置属性类
    private KuaidiniaoProperties kuaidiniaoProperties;
    @Bean
    public KuaiDiNiaoQueryAPI kuaiDiNiaoQueryAPI(){
        ExprsTrackConfig config = new ExprsTrackConfig();
        config.setApiUrl(kuaidiniaoProperties.getApiUrl());
        config.setUserKey(kuaidiniaoProperties.getUserKey());
        config.setUserSecret(kuaidiniaoProperties.getUserSecret());
        KuaiDiNiaoQueryAPI api = new KuaiDiNiaoQueryAPI(config);
        return api;
    }
    public KuaidiniaoProperties getKuaidiniaoProperties() {
        return kuaidiniaoProperties;
    }
    public void setKuaidiniaoProperties(KuaidiniaoProperties kuaidiniaoProperties) {
        this.kuaidiniaoProperties = kuaidiniaoProperties;
    }
}
package com.woniuxy.tool.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "kuaidiniao")
public class KuaidiniaoProperties {
    /**
     * 用户key
     */
    private String userKey;
    /**
     * 用户密码
     */
    private String userSecret;
    /**
     * 请求地址
     */
    private String apiUrl;
    省略setter getter
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值