SpringBoot 注解:@ConfigurationProperties 之浅析
该注解通常用来匹配 配置文件 中的一些数值,用法简单,不需要引入额外的jar,直接上 demo
application.properties
connection.userName="user-name"
connection.password="password"
connection.address[0]="beijing"
connection.address[1]="shanghai"
connection.address[2]="guangzhou"
[图片上传失败...(image-d38c1b-1541149658749)]
两个注解需要配合使用,当然你也可以使用其他的 @Service @Bean .......
构造测试请求:
@RestController
public class HealthController {
@Resource
private AutoConfigTest autoService;
@GetMapping("/health")
public String health() {
System.out.println("--------------" + autoService.getPassword());
System.out.println(autoService.getAddress());
return autoService.getAddress().toString();
}
}
结果输出:
--------------"password"
["beijing", "shanghai", "guangzhou"]
OK 使用完了,需不需要分析下 执行过程呢?
大家主要 debug 一下 ConfigurationPropertiesBindingPostProcessor
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
ConfigurationProperties annotation = getAnnotation(bean, beanName,
ConfigurationProperties.class);
if (annotation != null) {
bind(bean, beanName, annotation);
}
return bean;
}
主要就是 获取 @ConfigurationProperties 注解的类,如果annotation!=null
则进行绑定值的设置!
因为是在 集成 redis 的时候做的测试,参照 RedisProperties 可以看到一种 映射属性的高级用法
private final Jedis jedis = new Jedis();
...
/**
* Jedis client properties.
*/
public static class Jedis {
/**
* Jedis pool configuration.
*/
private Pool pool;
public Pool getPool() {
return this.pool;
}
public void setPool(Pool pool) {
this.pool = pool;
}
}
/**
* Pool properties.
*/
public static class Pool {
/**
* Maximum number of "idle" connections in the pool. Use a negative value to
* indicate an unlimited number of idle connections.
*/
private int maxIdle = 8;
/**
* Target for the minimum number of idle connections to maintain in the pool. This
* setting only has an effect if it is positive.
*/
private int minIdle = 0;
/**
* Maximum number of connections that can be allocated by the pool at a given
* time. Use a negative value for no limit.
*/
private int maxActive = 8;
/**
* Maximum amount of time a connection allocation should block before throwing an
* exception when the pool is exhausted. Use a negative value to block
* indefinitely.
*/
private Duration maxWait = Duration.ofMillis(-1);
...省略 get set...
}
#连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=1ms
#连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
可以看到 通过嵌套类 的属性的映射
大体 debug 跟踪了一下~~~~~~~~~~