自动配置原理:
1、在主启动类上添加了SpringBootApplication注解,这个注解组合了EnableAutoConfiguration注解;
2、EnableAutoConfiguration注解又组合了Import注解,导入了AutoConfigurationlmportSelector类;
3、实现selectlmports方法,这个方法经过层层调用,最终会读取META-INF目录下的后缀名为imorts的文件,注意,boot2.7以前的版本,读取的是spring.factories文件;
4、读取到全类名了之后,会解析注册条件,也就是@Conditional及其衍生注解,把满足注册条件的Bean对象自动注入到loc容器中
自定义starter以mybatis的starter为例
- 创建dmybatis-spring-boot-autoconfigure模块,提供自动配置功能,并且自定义配置文件 META-INF/spring/xx.imports
- 创建dmybatis-spring-boot-starter模块,在starter中自动配置模块
具体步骤
1. 新建模块
2. 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.14</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.0</version>
</dependency>
3. 编写配置类
package com.pwf.cn.config;
import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
import java.util.List;
@AutoConfiguration // 表示当前类是自动配置类
public class MybatisAutoConfig {
//SqlSessionFactoryBean
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean;
}
//MapperScannerConfigure
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(BeanFactory beanFactory){
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
//扫描的包: 启动类所在的包及其子类
List<String> packges = AutoConfigurationPackages.get(beanFactory);
String p = packges.get(0);
mapperScannerConfigurer.setBasePackage(p);
//扫描的注解:
mapperScannerConfigurer.setAnnotationClass(Mapper.class);
return mapperScannerConfigurer;
}
}
4. 配置xxx.imports文件
resources\META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports
到这里基本上已经具备自动配置功能
5. 准备starter
在pom.xml文件引入依赖
<dependency>
<groupId>com.pwf.cn</groupId>
<artifactId>dmybatis-spring-boot-autoconfigure</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.14</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.0</version>
</dependency>
6. 测试使用
引入自定义starter
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<dependency>
<groupId>com.pwf.cn</groupId>
<artifactId>dmybatis-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
成功!!!