【㊫SpringBoot】SpringBoot自定义starter
自动配置基本思想示例
以mybatis-spring-boot-starter为例。
1)当导入了 mybatis-spring-boot-starter后,其导入的相关依赖如下:
2)可以看到其导入了 mybatis-spring-boot-autoconfigure的jar包,其中有一个自动配置类MybatisAutoConfiguration
部分关键代码如下:
3)对于@Configuration和@Bean注解,其结合使用可以替代传统的xml配置文件。@Bean分别把SqlSessionTemplate和SqlSessionFactory注入到Spring容器。
对于注解@EnableConfigurationProperties,其作用是让后面指定的配置属性生效。这里指定的配置属性是MybatisProperties类:
把此类标记是一个配置属性类,prefix指定了前缀,其属性就是配置的可选参数。如配置包的别名:mybatis.type-aliases-package=com.zys.entity
4)在SpringBoot中,其使用了注解@Import,那么它会选择性的读取META-INF/spring.factories配置文件
5)如此只要在spring.factories文件配置了,就会根据条件加载进来,mybatis中自动配置的内容如下:
其中key是固定的,value是指定配置类的全路径。
命名规范
spring-boot-starter-xxx是SpringBoot官方定义的jar,如spring-bbot-starter-web。
xxx-spring-boot-starter是非官网定义的,如第三方jar包mybatis-spring-boot-starter。
自定义starter
说明:自定义一个starter,名字是token-redis-spring-boot-starter。
新建项目
创建一个maven的项目,不引入任何的依赖
配置pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
读取并注入配置信息
1)在包util下创建类TokenProperties,此类是一个配置属性类
package com.example.demo.util;
import org.springframework.boot.context.properties.ConfigurationProperties;
//配置前缀,在配置文件中使用时前缀就是hello,如hello.redis-host
@ConfigurationProperties(prefix = "hello")
public class TokenProperties {
//命名规范必须是驼峰式,解析时会自动将大写转小写,并加-
private String redisHost="localhost";
private String redisUsername="root";
private String redisPassword="123456";
public String getRedisHost() {
return redisHost;
}
public void setRedisHost(String redisHost) {
this.redisHost = redisHost;
}
public String getRedisUsername() {
return redisUsername;
}
public void setRedisUsername(String redisUsername) {
this.redisUsername = redisUsername;
}
public String getRedisPassword() {
return redisPassword;
}
public void setRedisPassword(String redisPassword) {
this.redisPassword = redisPassword;
}
}
2)在包service下创建类TokenService,作为一个服务
package com.example.demo.service;
import com.example.demo.util.TokenProperties;
import org.springframework.beans.factory.annotation.Autowired;
public class TokenService {
@Autowired
private TokenProperties tokenProperties;
public String getToken() {
//模拟生成token的信息
return tokenProperties.getRedisHost() + "," + tokenProperties.getRedisUsername() + "," + tokenProperties.getRedisPassword();
}
}
3)在包config下创建自动化配置类TokenAutoConfiguration,实现自动配置,把服务注入到Spring中。
package com.example.demo.config;
import com.example.demo.service.TokenService;
import com.example.demo.util.TokenProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(TokenProperties.class)
public class TokenAutoConfiguration {
@Bean
public TokenService tokenService(){
return new TokenService();
}
}
创建spring.factories文件
在资源目录下,创建文件META-INF\spring.factories,指定自动配置类的路径
#后面的路径是TokenAutoConfiguration所在的路径
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.config.TokenAutoConfiguration
反斜杠表示换行,太长了可以换到下一行。
把项目打成jar发布到maven仓库
1)直接使用idea的maven功能进行打包
2)使用命令打包
打开cmd,切换到项目所在的路径,执行mvn clean install,就会将项目打包到本地的maven仓库,就可以使用了。
使用自定义的starter
1)新建一个SpringBoot的项目,导入依赖
<dependency>
<groupId>com.example</groupId>
<artifactId>token-redis-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
2)在配置文件进行配置来测试, 输入时会自动提示