注解ConfigurationProperties、EnableConfigurationProperties的用法
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: 1username: lyfpassword: xxxxxxxemail: it-api@mail.xxxxx.comuserinfo1:id: 11username: lyf1password: xxxxxxxemail: 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")@Autowiredprivate 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")@Autowiredprivate 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")@Autowiredprivate UUser user1;@GetMapping("/getUser2")public String getUser3(){return user3.toString();}
}
启动项目后,请求localhost:8080/getUser3,成功将构建UUser对象信息成功输出