1、@ConfigurationProperties的作用
SpringBoot提供的@ConfigurationProperties具有很强大的功能,该注解可以将properties配置文件中的内容读取并封装到JavaBean中,即配置绑定
使用前提!!!
只有在容器中的组件,才能使用SpringBoot提供的强大功能,也就是说将配置文件内容封装到某个类时,该类必须在容器内。
2、@Component+@ConfigurationProperties实现配置绑定
(1)在工程中新创建一个汽车类Car
package com.yjh.bean;
public class Car {
private String name;
private Integer price;
public Car() {
}
public Car(String name, Integer price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
(2)在配置文件application.properties中添加内容
mycar.name = byd
mycar.price = 100000
(3)在Car上添加注解@Component将该组件加入容器,添加注解@ConfigurationProperties(prefix="mycar")其中参数prefix指定配置文件中的前缀。指定为mycar后会将配置文件中以mycar开头的内容赋值给组件中的属性。配置文件中的brand会赋值给组件的brand属性,price会赋值给组件的price属性。因此,必须保证配置文件前缀后的字段与组件属性对应。
package com.yjh.bean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String name;
private Integer price;
public Car() {
}
public Car(String name, Integer price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
此时并没有完成,IDEA会给一个提示,截图如下:
其实不用管这个提示代码也可以运行。根据这个提示进入官网可以发现官网建议在配置文件中使用自定义元数据时,最好添加spring-boot-configuration-processor依赖,添加了这个依赖,我们在配置文件中自定义时编辑器会给我们提示。具体的使用方法就是在pom.xml中添加如下的dependency。
(4)编写代码测试,在HelloWordController中自动注入容器中的car。
package com.yjh.Controller;
import com.yjh.bean.Car;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWordController {
@Autowired
Car car;
@RequestMapping("/Car")
public Car getCar()
{
return car;
}
@RequestMapping("/Hello")
public String handle01()
{
return "Hello Spring Boot 2";
}
}
重新运行主程序,并访问http://localhost:8888/Car
可以看到配置文件的数据已经绑定到容器中的组件。
3、@EnableConfigurationProperties + @ConfigurationProperties实现配置绑定
(1)在配置类上加上注解@EnableConfigurationProperties(所要配置的类名.class)
(2)在需要配置绑定的类上添加@ConfigurationProperties(prefis="前缀名")此时可以不用注解@Component,这是因为@EnableConfigurationProperties注解已经把对应的组件装入容器了。
(3)进行测试
测试成功。
4、总结
无论是@EnableConfigurationProperties + @ConfigurationProperties还是@Component+@ConfigurationProperties都能实现配置绑定。但是这两种方式在使用场景上有点区别。
(1)如果使用的第三方包中的组件,这时我们无法在该组件上添加@Component,此时使用@EnableConfigurationProperties + @ConfigurationProperties实现配置绑定
(2)在我们自定义的组件中,我个人觉得@Component+@ConfigurationProperties使用更便捷一点。