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://";@Beanpublic 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{@Resourceprivate 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中就会有对应的提示了。