1 @ConfigurationProperties
@ConfigurationProperties主要作用就是将prefix属性指定的前缀配置项的值绑定到这个JavaBean上 ,通过指定的前缀,来绑定配置文件中的配置。这样的好处是将配置数据与JOPO进行转换,能够管理一个类别的所有配置信息,一次性加载,便于操作
由上图可知,@Target({ ElementType.TYPE, ElementType.METHOD })
ConfigurationProperties注解可用在类上和方法上(必须是配置类中的标注了@Bean注解的方法)。接下来我将用代码来演示@ConfigurationProperties的两种用途。演示项目的解构为maven项目,引入的相关依赖为
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
application.yml配置文件信息如下
userinfo:
id: 1
username: lyf
password: xxxxxxx
email: it-api@mail.xxxxx.com
userinfo1:
id: 11
username: lyf1
password: xxxxxxx
email: it-api@mail.xxxxx.com1
1.1 用在类上
/**
* @Author lyf
* @Date 2023/2/15 - 08:56
* @Description
**/
@Data
@Component("user1")
@ConfigurationProperties(prefix = "userinfo")
public class User {
private int id ;
private String username;
private String password;
private String email;
}
@ConfigurationProperties(prefix = “userinfo”) 意指将application.yml中前缀为userinfo的配置信息按照属性一一对应加载到User对象上
/**
* @Author lyf
* @Date 2023/2/15 - 09:20
* @Description
**/
@RestController
public class UserController {
@Qualifier("user1")
@Autowired
private User user1;
@GetMapping("/getUser1")
public String getUser1(){
return user1.toString();
}
}
启动项目后,请求localhost:8080/getUser1,成功将userinfo前缀中配置的信息输出
1.2 用在方法上
@Configuration
public class Demo1 {
@Bean("user2")
@ConfigurationProperties(prefix = "userinfo1")
public User user(){
return new User();
}
}
@ConfigurationProperties(prefix = “userinfo1”) 结合配置类中@Bean方法来将配置文件中前缀为userinfo1的配置信息加载到User实例上。
这里可以看到仅仅通过new关键字实例一个User对象,并没有看到set 属性的操作,这是Spring框架帮助我们做了这一步,所以User类不能忽略 get set 方法,否则无法将配置信息设置到对应的类属性中。User类上@Data注解实现get set 方法
/**
* @Author lyf
* @Date 2023/2/15 - 09:20
* @Description
**/
@RestController
public class UserController {
@Qualifier("user2")
@Autowired
private User user1;
@GetMapping("/getUser2")
public String getUser2(){
return user2.toString();
}
}
启动项目后,请求localhost:8080/getUser2,成功将userinfo1前缀中配置的信息输出
2 @EnableConfigurationProperties
@EnableConfigurationProperties注解的主要作用是让@ConfigurationProperties注解生效。@Target(ElementType.TYPE)
意味着只能作用在类上。@EnableConfigurationProperties注解的主要用途是根据导入的配置类信息【使用】进一步构造需要Bean 信息,一般都搭配@Configuration+@Bean使用。
2.1 @EnableConfigurationProperties使用
/**
* @Author lyf
* @Date 2023/2/15 - 10:17
* @Description
**/
@Data
public class UUser {
private int id ;
private String username;
private String password;
private String email;
}
/**
* @Author lyf
* @Date 2023/2/15 - 09:29
* @Description
**/
@Configuration
@EnableConfigurationProperties(User.class)
public class Demo2 {
private User user1;
@Bean("user3")
public UUser autoconfiguration(User user1){
this.user1=user1;
UUser newUser=new UUser();
newUser.setId(2);
newUser.setUsername("XXXX");
newUser.setEmail("XXXXX");
newUser.setPassword("XXXXXX");
return newUser;
}
}
autoconfiguration方法依赖于User实例,尽管在autoconfiguration(User user1)方法中没有对参数赋值操作,@EnableConfigurationProperties(User.class)
告知当前配置类使用User类信息,所以在调用autoconfiguration方法时,会先从Spring IOC 容器中获取名称为user1的Bean。
/**
* @Author lyf
* @Date 2023/2/15 - 09:20
* @Description
**/
@RestController
public class UserController {
@Qualifier("user3")
@Autowired
private UUser user1;
@GetMapping("/getUser2")
public String getUser3(){
return user3.toString();
}
}
启动项目后,请求localhost:8080/getUser3,成功将构建UUser对象信息成功输出