一、应用场景
在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在springboot的项目中,一般会将这些公共组件封装为springboot的starter。
二、以mybatis的starter为例
1、需求:自定义mybatis的starter
2、步骤:
创建 dmybatis-spring-boot-autoconfigure 模块,提供自动配置类,并自定义配置文件META-INF/spring/xxx.imports
注意:springboot2.7以下版本是spring.factories配置文件,springboot3.0以上版本是 .imports配置文件
创建 dmybatis-spring-boot-starter 模块,在模块中引入自动配置模块
三、实际操作
1、创建两个maven工程
另一个工程同样的配置。
在autoconfig工程下创建config包,创建MyBatisAutoConfig类。添@AutoConfiguration注解表示当前类是一个自动配置类。
2、在类中进行代码编写
需要完成对SqlSessionFactoryBean和MapperScannerConfigurer的注入
先进行pom.xml文件的配置,添加下面这四个的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>3.3.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>3.3.4</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.3</version>
</dependency>
类中的代码编写
package com.dzu.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();
//与数据库建立联系,通过datasource,在方法中声明
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean;
}
//MapperScannerConfigurer
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(BeanFactory beanFactory){
//创建对象
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
//扫描包:启动类所在的包及其子包
//在依赖中会提供api进行获取包名,一般只需要获取到第一个即可。
List<String> packages = AutoConfigurationPackages.get(beanFactory);
String p = packages.get(0);
mapperScannerConfigurer.setBasePackage(p);
//扫描注解:Mapper注解
mapperScannerConfigurer.setAnnotationClass(Mapper.class);
return mapperScannerConfigurer;
}
}
3、在配置文件中声明自动配置文件的全类名
在main目录下创建resources文件夹,进行全类名的设置,目录结构如下图。
注意:为了目录结构的简洁美观,可以把自动创建但没有使用的目录结构删除
文件名最好不要手写,在maven依赖中找就行。
在 .import配置文件中声明全类名
方法:双击类名,右键单击,选择copy/reference,复制过去即可
4、dmybatis-spring-boot-starter的配置
这个工程的src目录是没有用的,直接删除即可。
只需要在pom.xml文件中导入依赖即可。
ok这样自定义mybatis的starter就完成了。
四、在spring-boot-mybatis工程中测试自定义starter
有自动提示就是配置成功了。
把原来的依赖注释掉,使用自定义的进行测试。