前言
新的一年到了,在这里先祝大家新年快乐.我们在上一篇spring boot 源码解析12-servlet容器的建立 中 分析 ServerProperties时,发现其类上有@ConfigurationProperties 注解,加上该注解后,就会注入在application.properties中server开头的属性,那么它是怎么生效的呢?我们这篇文章就来分析一下.这篇文章内容比较长,大家慢慢看…
@ConfigurationProperties 使用方式
我们首先声明实体类,用于属性的注入.代码如下:
public class People {
private String name;
private Integer age;
private List<String> address;
private Phone phone;
// get set 忽略,自己加上即可..
}
public class Phone {
private String number;
// get set 忽略,自己加上即可..
}
在application.properties 中加入如下配置:
com.example.demo.name=${aaa:hi}
com.example.demo.age=11
com.example.demo.address[0]=北京
com.example.demo.address[1]=上海
com.example.demo.address[2]=广州
com.example.demo.phone.number=1111111
@ConfigurationProperties 注解支持两种方式.
加在类上,需要和@Component注解,结合使用.代码如下:
@Component
@ConfigurationProperties(prefix = "com.example.demo")
public class People {
private String name;
private Integer age;
private List<String> address;
private Phone phone;
}
通过@Bean的方式进行声明,这里我们加在启动类即可,代码如下:
@SpringBootApplication
public class DemoApplication {
@Bean
@ConfigurationProperties(prefix = "com.example.demo")
public People people() {
return new People();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
这里我们使用第2种,原因是这样好debug,看源码…
我们再写一个Controller进行测试一下吧.代码如下:
@RestController
public class TestController {
@Autowired
private People people;
@RequestMapping("/get_name")
public String getName() {
return people.getName();
}
@RequestMapping("/get_address")
public List<String> getAddress() {
return people.getAddress();
}
@RequestMapping("/get_phone_numer")
public String getNumber() {
return people.getPhone().getNumber();
}
}
访问 /get_name,其返回值如下:
hi
访问 /get_address,其返回值如下:
[“北京”,”上海”,”广州”]
访问 get_phone_numer,其返回值如下:
1111111
使用方式就介绍完了,接下来,我们就来看看spring 是如何处理的吧.