学会@ConfigurationProperties月薪过三千

打印 上一主题 下一主题

主题 840|帖子 840|积分 2520

学习 @ConfigurationProperties 之前我们需要一些前置知识点:
@Value是个什么东西
首先明确:@ConfigurationProperties 是 SpringBoot 注解。
我们在讲 @Value 时知道了如何将配置文件的属性注入到变量中,废话不多说,直接上代码。
这是配置文件配置:
  1. spring.datasource.dynamic.mysql.driverClassName=com.mysql.cj.jdbc.Driver
  2. spring.datasource.dynamic.mysql.url=jdbc:mysql://localhost:3306/db1
  3. spring.datasource.dynamic.mysql.username=root
  4. spring.datasource.dynamic.mysql.password=root
复制代码
麻烦?
没事,有简单的,我们用简单的:
  1. spring:
  2.   datasource:
  3.     dynamic:
  4.       mysql:
  5.         driverClassName: com.mysql.cj.jdbc.Driver
  6.         url: jdbc:mysql://localhost:3306/db1
  7.         username: root
  8.         password: root
复制代码
使用 @Value 获取配置:
  1. @Configuration
  2. public class DynamicDataSourceConfig {
  3.     
  4.     @Value("${spring.datasource.dynamic.mysql.driverClassName}")
  5.     private String driverClassName;
  6.     @Value("${spring.datasource.dynamic.mysql.url}")
  7.     private String url;
  8.     @Value("${spring.datasource.dynamic.mysql.username}")
  9.     private String username;
  10.     @Value("${spring.datasource.dynamic.mysql.password}")
  11.     private String password;    
  12. }
复制代码
写完之后整整齐齐,帅!
如果有人觉得帅,一定还没成长成一个合格的程序员。
我们程序员追求什么?
优雅。
优雅永不过时。
优雅最重要的一条原则是什么?
不写重复代码!
所以怎么办?
有办法。
下面我们讲一下 @ConfigurationProperties 。
作用

将标注了 @ConfigurationProperties 注解的Spring容器中的Bean与配置文件中的属性进行一一绑定,用于更加快速、方便的读取配置文件的内容。
使用方式一:@Component

直接上代码:
  1. @Component
  2. @ConfigurationProperties(prefix = "spring.datasource.dynamic.mysql")
  3. @Data
  4. public class DynamicDataSourceConfig {
  5.     
  6.     private String driverClassName;
  7.     private String url;
  8.     private String username;
  9.     private String password;    
  10. }
复制代码
写完之后清清爽爽,帅!
我们发现了几个关键点:
1.原来的 @Configuration 变成了 @Component
这个不影响,因为 @Configuration 中包含了 @Component,这里主要强调通过@Component注解将其注册成Bean。
2.@ConfigurationProperties(prefix = "")
这是我们的主角,prefix 就是匹配我们属性值的前缀,有了它我们就少写好多代码。
3.多了个@Data
@Data的功能中包含了setter方法,没有setter怎么赋值?!
使用方式二:@EnableConfigurationProperties

WTF is @EnableConfigurationProperties?
@EnableConfigurationProperties 就是:
@ConfigurationProperties,启动!
如果配置类只配置了 @ConfigurationProperties 注解,而没有使用@Component,也就是在IOC容器中是获取不到bean。
那就需要 @EnableConfigurationProperties 把使用 @ConfigurationProperties 的类进行了一次注入
怎么用呢?
需要与@Configuration一起使用。
需要与@Configuration一起使用。
需要与@Configuration一起使用。
上代码:
  1. @ConfigurationProperties(prefix = "father")
  2. @Data
  3. public class Father {
  4.    private String name;
  5. }
复制代码
  1. @Configuration
  2. @EnableConfigurationProperties(Father.class)
  3. public class MainConfig {
  4. }
复制代码
实际开发中可能更多的写在 Application 启动类上。
这时候 A 同学问了:
那启动类上没有 @Configuration 啊?
有的,@SpringBootApplication 也是一个@Configuration。
又有 B 同学问了:
那我有两个配置类怎么写呢?
哎?好办。
  1. @Configuration
  2. @EnableConfigurationProperties(Father.class, Son.class)
  3. public class MainConfig {
  4. }
复制代码
又有 C 同学问了:
那我有 100 个配置类呢?
聪明的 B 同学说:
我知道我知道!
  1. @Configuration
  2. @EnableConfigurationProperties(Father.class, Son.class, GrandSon.class, GrandgrandSon.class...)
  3. public class MainConfig {
  4. }
复制代码
...
不愧是你。
那怎么办呢?
也有办法。
使用方式三:@ConfigurationPropertiesScan

SpringBoot 2.2.0版本以后提供了这个注解。
这个注解加到启动类上,注明包路径。
系统就会扫描这个包路径下的所有包含 @ConfigurationProperties 注解的配置类。
如果不写包路径,就默认扫描启动类所在包及其子包。
这样就不用写一百个类了。
  1. @SpringBootApplication
  2. @ConfigurationPropertiesScan
  3. public class DemoAnnotationApplication {
  4.     public static void main(String[] args) {
  5.         SpringApplication.run(DemoAnnotationApplication.class, args);
  6.     }
  7. }
复制代码
差不多了吧?
什么?小明,你有话说?
那既然 @Component 能注册成 Bean,那我使用 @Configuration 加 @Bean 注册又怎么说?
卧槽,还有高手?
使用方式四:@Bean

  1. @Data
  2. public class Animal {
  3.     private String name;
  4. }
复制代码
  1. @Configuration
  2. public class MainConfig {
  3.     @Bean
  4.     @ConfigurationProperties(prefix = "animal")
  5.     public Animal getAnimalBean() {
  6.         return new Animal();
  7.     }
  8. }
复制代码
  1. animal.name=Wangcai
复制代码
还有高手吗?
下课!
  联系我:
https://stanezhang.github.io/

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表