ConfigrationProperties
先看普通的@ConfigrationProperties的基本使用
这个注解表示它可以使用yaml注入属性值。
通常还需要指定它为一个@Component,将这个类纳入IoC容器的管理。自动扫描进IoC。
它的后面需要指定prefix值,这表明了对应yaml的前缀。
步骤:
在要放入IoC容器中的类上添加两个注解
@Component // 表示这个类会被放进IoC容器管理 @ConfigurationProperties(prefix = "dog") // 表示这个类可以使用yaml注入,它在yaml中的名字为dog public class Dog { @Value("旺财") // 会被yaml注入值覆盖,若yaml中没有,则使用这个值 private String name; @Value("3") // 会被yaml中的注入值覆盖,若没有,则使用这个注入的值 private Integer age; ....... // 构造函数,setter,getter,toString() }
application.yaml
dog: name: 旺财233
测试
@SpringBootTest class Springboot02ConfigApplicationTests { @Autowired // autowired表示这个对象是从IoC容器提取出来的 private Dog dog; @Test void contextLoads() { System.out.println(dog); } }
观察输出,可以看到,名字被yaml注入值覆盖了;年龄是采用@Value注入后的值(不是空值)
Dog{name='旺财233', age=3}
EnableConfigurationProperties
在很多spring源码中,常见的注解,通常将它应用到spring的配置类下,
即,@EnableConfigurationProperties
与@Configuration
(声明是一个配置类,管理很多Bean)会经常成对使用。
@EnableConfigurationProperties 可以让指定的类纳入IoC管理,成为一个Bean。而不需要使用@Component这个注解。
下面以Spring的某源码为例。
HttpEncodingAutoConfiguration
package org.springframework.boot.autoconfigure.web.servlet;
import .....
// 从Configuration 可以看出这个类是一个spring配置类。代替spring的xml配置文件,里面放着各种bean配置声明
@Configuration(proxyBeanMethods = false)
// 配置其中的属性
@EnableConfigurationProperties(ServerProperties.class)
// 判断条件,是否生效。
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
private final Encoding properties;
public HttpEncodingAutoConfiguration(ServerProperties properties) {
this.properties = properties.getServlet().getEncoding();
}
@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
......
}
.........
}
ServerProperties.java
ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
/**
* Server HTTP port.
*/
private Integer port;
/**
* Network address to which the server should bind.
*/
private InetAddress address;
........
}