当我们使用SpringBoot时,很多时候我们需要在项目中引入许多常用的依赖,这些依赖之间可能会存在依赖关系,我们需要维护它们的版本,非常麻烦。为了解决这个问题,SpringBoot提供了Starter的机制,它可以封装依赖的版本等信息,方便我们统一使用。
在本文中,我将详细介绍Java SpringBoot自定义Starter的过程,让你可以轻松创建自己的Starter。
一、什么是SpringBoot Starter
SpringBoot Starter是用来简化SpringBoot应用的依赖引用的一种方式,通常一个SpringBoot Starter都包含了一组关于某个功能的依赖,如SpringBoot Starter Web是一个提供了常用Web依赖的Starter。
除了依赖管理之外,自定义Starter还可以提供一些自定义的配置,简化业务开发。
二、创建SpringBoot Starter的步骤
1. 创建一个空的Maven工程
在Maven工程中,创建一个空的module,命名为xxx-spring-boot-starter
,其中xxx
为自定义Starter的名称,比如mybatis
。
2. 引入相关依赖
在pom.xml中引入以下的依赖:
<dependencies>
<!-- SpringBoot依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>${springboot.version}</version>
</dependency>
<!-- 自定义Starter的依赖,这里以mybatis为例 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
在上面的依赖中,spring-boot-autoconfigure
是必须要引入的,这个依赖提供了自动配置机制的基本实现。
3. 创建自动配置类
在src/main/java目录下创建一个自动配置类,命名为XxxAutoConfiguration
,其中Xxx
为自定义Starter的名称,比如Mybatis
。
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@EnableConfigurationProperties(MapperProperties.class)
public class MybatisAutoConfiguration {
private final MapperProperties mapperProperties;
public MybatisAutoConfiguration(MapperProperties mapperProperties) {
this.mapperProperties = mapperProperties;
}
@Bean
@ConditionalOnMissingBean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
if (StringUtils.hasText(this.mapperProperties.getConfigLocation())) {
factory.setConfigLocation(new DefaultResourceLoader().getResource(
this.mapperProperties.getConfigLocation()));
}
return factory.getObject();
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
configurer.setBasePackage(this.mapperProperties.getBasePackage());
return configurer;
}
}
在上面的配置类中,我们使用了SpringBoot自动配置机制提供的注解:
@Configuration
:表明这个类是一个配置类。@ConditionalOnClass
:表示只有当classpath下存在指定的类时,才会创建这个配置类。@EnableConfigurationProperties
:激活@ConfigurationProperties的作用。
4. 创建Starter配置类
在src/main/java目录下,创建一个配置类,命名为XxxProperties
,其中Xxx
为自定义Starter的名称,比如Mybatis
。
@ConfigurationProperties(prefix = "mybatis")
public class MybatisProperties {
private static final String DEFAULT_CONFIG_LOCATION = "classpath:mybatis-config.xml";
/**
* Mybatis配置文件的路径,默认为classpath:mybatis-config.xml
*/
private String configLocation = DEFAULT_CONFIG_LOCATION;
/**
* Mybatis映射文件的路径,多个使用逗号分隔
*/
private String mapperLocations;
/**
* Mapper接口所在包,多个使用逗号分隔
*/
private String basePackage;
/**
* Configuration custom.
*/
private Configuration configuration;
}
这个配置类用来指定自定义Starter的一些配置。其中@ConfigurationProperties
注解指定了这个配置类的前缀为mybatis
,也就是说在application.yml中如下配置就会映射到这个配置类中:
mybatis:
config-location: classpath:mybatis-config.xml
mapper-locations: classpath*:mappers/**/*.xml
base-package: com.xxx.mapper
5. 创建Starter类
在src/main/java目录下,创建一个Starter类,命名为XxxStarter
,其中Xxx
为自定义Starter的名称,比如Mybatis
。
@Configuration
@EnableConfigurationProperties(MybatisProperties.class)
@ConditionalOnClass({SqlSessionFactory.class, SqlSessionFactoryBean.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class MybatisStarter {
@Bean
public MybatisAutoConfiguration mybatisAutoConfiguration(MybatisProperties mybatisProperties) {
return new MybatisAutoConfiguration(mybatisProperties);
}
}
在上面的Starter类中,我们使用了SpringBoot自动配置机制提供的注解:
@Configuration
:表明这个类是一个配置类。@EnableConfigurationProperties
:激活@ConfigurationProperties的作用。@ConditionalOnClass
:表示只有当classpath下存在指定的类时,才会创建这个Starter类。@AutoConfigureAfter
:表示在某个配置类之后再进行自动配置。
6. 打包并安装
完成以上五个步骤之后,通过mvn clean install
命令将自定义的Starter打包并安装到本地Maven仓库。
三、使用自定义Starter
完成自定义Starter的创建之后,就可以在项目中直接使用了。只需要在项目的pom.xml中引入自定义Starter的依赖即可,在以mybatis为例的项目中,只需在pom.xml文件中添加以下依赖:
<dependency>
<groupId>com.xxx</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
这里的com.xxx
为自定义Starter打包时的groupId。
使用自定义Starter启动的时候,可以在application.yml文件中进行配置:
mybatis:
config-location: classpath:mybatis-config.xml
mapper-locations: classpath*:mappers/**/*.xml
base-package: com.xxx.mapper
四、自定义Starter的示例
1. Mybatis Starter
Mybatis Starter是一个提供了常用Mybatis依赖的Starter,在使用的时候,只需要引入以下依赖,就可以方便的使用Mybatis了:
<dependency>
<groupId>com.xxx</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
同时,在application.yml文件中可以进行Mybatis的配置:
mybatis:
config-location: classpath:mybatis-config.xml
mapper-locations: classpath*:mappers/**/*.xml
base-package: com.xxx.mapper
2. Redis Starter
Redis Starter是一个提供了常用Redis依赖的Starter,在使用的时候,只需要引入以下依赖,就可以方便的使用Redis了:
<dependency>
<groupId>com.xxx</groupId>
<artifactId>redis-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
同时,在application.yml文件中可以进行Redis的配置:
spring:
redis:
host: localhost
port: 6379
database: 0
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java SpringBoot自定义starter详解 - Python技术站