SpringBoot自动装配原理:
- @EnableAutoConfiguration注解开启自动装配功能,该注解通常放在应用的主类上。
- spring.factories文件位于META-INF目录下的配置文件中定义各个自动装配类的全限定名
当SpringBoot启动时,会加载classpath下所有的spring.factories文件,并根据定义的自动配置类全限定名,将其实例化并添加到Spring应用上下文中。
自动配置类通常会通过@Configuration注解标注(@ComponentScan/@Import等)实现各种逻辑
官方提供的starter命名:spring-boot-starter-xxx
第三方提供的starter明明:xxx-spring-boot-starter
SpringBoot常见的starter
====================================================
自定义一个redisson的starter
一、创建按一个SpringBoot项目,命名:redisson-spring-boot-starter
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.1.RELEASE</version>
<!-- 不让jar进行传递 避免jar包冲突-->
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
二、创建配置解析类RedissonProperties
@ConfigurationProperties(prefix = "tian.redisson")
public class RedissonProperties{
private String host = "localhost";
private int port = 6379;
private int timeout;
//get set 省略
}
三、自动装配类
@EnableConfigurationProperties(RedissonProperties.class)
@Configuration
public class RedissonAutoConfiguration{
private static final String PREFIX = "redis://";
@Bean
public RedissonClient redissonClient(RedissonProperties redissonProperties){
Config config = new Config();
//redis单机模式
config.useSingleServer().setAddress(PREFIX+redissonProperties.getHost()+":"+redissonProperties.getPort())
.setConnectTimeout(redissonProperties.getTimeout());
return Redisson.create(config);
}
}
四、resources目录下创建META-INF,在此目录下创建spring.factories文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.tian.RedissonAutoConfiguration
五、使用自定义starter
再创建一个SpringBoot项目,引入自定义starter
<dependency>
<groupId>com.tian</groupId>
<artifactId>charge-sms-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
ResissonProperties类中对host和port赋予了默认值,所以在application.properties配置文件中若不配任何参数,使用的就是默认值。
也可以配置
tian.redisson.host=localhost
tian.redisson.port=6379
tian.redisson.timeout=1000
六、实际应用
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController{
@Resource
private RedissonClient redissonClient;
@GetMapping("/redisson")
public String redisson(){
}
}
配置提示功能
在META-INF下面创建一个文件 additional-spring-configuration-metadata.json
文件内容如下:
{
"properties": [
{
"name": "tian.redisson.host",
"type": "java.lang.String",
"description": "redis服务地址ip",
"defaultValue": "localhost"
},
{
"name": "tian.redisson.port",
"type": "java.lang.Integer",
"description": "redis服务端口号",
"defaultValue": 6379
},
{
"name": "tian.redisson.timeout",
"type": "java.lang.Integer",
"description": "redis连接超时时间",
"defaultValue": 1000
}
]
}
重新打包,在使用的项目里执行Reload All Maven,再去properties中就会有对应的提示了。