SpringBoot——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配置所需要
- 依赖
- 配置文件 data.properties
- 配置类
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;
例子:
- 创建 kuaidiniao项目,quickstart项目
- 添加功能
- 安装到本地
- 创建kuaidiniao-spring-boot-starter 项目,quickstart项目
- 在resources目录下添加META-INF/spring.factories文件,内容指向KuaidiniaoAutoConfiguration
- 编写KuaidiniaoAutoConfiguration
- 编写配置属性类
- 安装kuaidiniao-spring-boot-starter
- 在项目中导入,并使用
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
}