SpringBoot自定义Starter与自动配置实现方法详解
什么是SpringBoot Starter
SpringBoot Starter是一种用于扩展SpringBoot框架功能的一种技术手段,它可以将应用程序中涉及到的依赖库集成到SpringBoot环境中,使得应用程序更加简单、灵活且易于扩展。
Starter的实现过程主要有自定义Starter和自动配置两种方式,接下来我们将详细讲解这两种实现方法的具体步骤。
自定义Starter
首先,我们需要自定义一个Starter,其主要提供了一些功能性组件的依赖,让用户可以更加方便地使用这些组件。例如,我们可以自定义一个Mybatis-Starter,其主要提供了Mybatis的依赖,并且初始化其默认配置,这样,用户只需要添加这个Starter的依赖,就可以使用Mybatis的相关功能。
Starter的结构一般为:
mybatis-spring-boot-starter
|--src
|----main
|------java
|--------cn.lwenhao.mybatis
|----------MybatisAutoConfiguration.java
|------resources
|--------META-INF
|----------spring.factories
|----------mybatis.properties
|--pom.xml
其中:
- MybatisAutoConfiguration.java:Starter的核心代码,主要负责组件的初始化和配置。
- spring.factories:定义SpringBoot自动配置加载器,需要将MybatisAutoConfiguration注册进去。
- mybatis.properties:提供一些组件的默认属性配置项。
自定义Starter的实现步骤:
- 创建一个Maven项目,并命名为“mybatis-spring-boot-starter”,其中groupId和artifactId根据需求自行命名。
- 在pom.xml中添加spring-boot-starter-parent的parent,并在dependencies中添加spring-boot-autoconfigure、spring-boot-starter和mybatis-spring等依赖。
- 在src/main/java/cn/lwenhao/mybatis/目录下新建MybatisAutoConfiguration.java文件,并添加注解@Configuration和@EnableConfigurationProperties(MybatisProperties.class)。
- 在MybatisAutoConfiguration.java中添加初始化Bean的代码,例如:
@Configuration
@EnableConfigurationProperties(MybatisProperties.class)
public class MybatisAutoConfiguration {
@Autowired
private MybatisProperties properties;
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setMapperLocations(this.properties.resolveMapperLocations());
return factory.getObject();
}
}
- 在src/main/resources/META-INF/目录下新建spring.factories文件,并添加以下内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.lwenhao.mybatis.MybatisAutoConfiguration
-
在src/main/resources/目录下新建mybatis.properties文件,并添加相关属性配置项。
-
编译打包Starter项目,并上传至Maven私服或中央仓库。
至此,自定义Starter的实现完成。用户需要使用这个Starter,只需添加以下依赖即可:
<dependency>
<groupId>my.groupid</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
自动配置
在自定义Starter的基础上,我们可以实现自动配置功能,将组件的配置信息自动绑定到SpringBoot的配置文件中,从而实现应用程序的自动化配置。
以Mybatis为例,我们可以将默认的属性配置项绑定到SpringBoot的application.yml中,用户可以通过修改配置文件中的属性来实现应用程序级别的自定义配置。
自动配置的实现步骤:
- 在MybatisStarter的基础上,为其提供属性配置项的类MybatisProperties,其中包含了一些默认属性,例如:
@ConfigurationProperties(prefix = "spring.mybatis")
public class MybatisProperties {
private String mapperLocations = "classpath*:mapper/**/*.xml";
private String typeAliasesPackage;
//... 其他属性省略
}
- 在MybatisAutoConfiguration中,为其提供属性配置项的Bean,例如:
@Bean
@ConfigurationProperties(prefix = "spring.mybatis")
public MybatisProperties mybatisProperties() {
return new MybatisProperties();
}
- 对于需要进行复杂配置的组件,我们可以将其属性配置项抽象成为一个配置类,例如DataSourceProperties:
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties {
private String url;
private String username;
//... 其他属性省略
// Getters & Setters
}
- 在MybatisAutoConfiguration中,为其注入DataSource:
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setMapperLocations(this.properties.resolveMapperLocations());
return factory.getObject();
}
- 将MybatisStarter打包成一个SpringBoot自动配置的jar,并上传至Maven。
至此,Mybatis的自动化配置已经完成,用户可以通过修改application.yml配置文件中与Mybatis相关的属性,来实现应用程序级别的自定义配置。
示例
我们通过一个SpringBoot应用程序,来展示如何使用我们自定义的Mybatis Starter。
- 创建一个SpringBoot应用程序,首先在pom.xml中添加依赖:
<dependency>
<groupId>my.groupid</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
- 配置SpringBoot应用程序的application.yml,例如:
spring:
datasource:
url: jdbc:mysql://localhost:3306/my_db
username: root
password: password123
driver-class-name: com.mysql.jdbc.Driver
mybatis:
mapperLocations: classpath:mapper/**/*.xml
typeAliasesPackage: cn.lwenhao.entity
- 创建用户表:
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 创建UserMapper.java:
@Mapper
public interface UserMapper {
List<User> selectAllUsers();
}
- 创建User.java:
public class User {
private Long id;
private String name;
private Integer age;
//... getters & setters
}
- 编写测试代码:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisAutoConfigurationTests {
@Autowired
private UserMapper mapper;
@Test
public void testSelectAllUsers() {
List<User> users = this.mapper.selectAllUsers();
Assert.assertEquals(1, users.size());
}
}
然后,你就可以在测试代码中使用Mybatis组件了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot自定义Starter与自动配置实现方法详解 - Python技术站