• 学会@ConfigurationProperties月薪过三千


    学习 @ConfigurationProperties 之前我们需要一些前置知识点:

    @Value是个什么东西

    首先明确:@ConfigurationProperties 是 SpringBoot 注解。

    我们在讲 @Value 时知道了如何将配置文件的属性注入到变量中,废话不多说,直接上代码。

    这是配置文件配置:

    spring.datasource.dynamic.mysql.driverClassName=com.mysql.cj.jdbc.Driver
    spring.datasource.dynamic.mysql.url=jdbc:mysql://localhost:3306/db1
    spring.datasource.dynamic.mysql.username=root
    spring.datasource.dynamic.mysql.password=root
    

    麻烦?

    没事,有简单的,我们用简单的:

    spring:
      datasource:
        dynamic:
          mysql:
            driverClassName: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://localhost:3306/db1
            username: root
            password: root
    

    使用 @Value 获取配置:

    @Configuration
    public class DynamicDataSourceConfig {
        
        @Value("${spring.datasource.dynamic.mysql.driverClassName}")
        private String driverClassName;
        @Value("${spring.datasource.dynamic.mysql.url}")
        private String url;
        @Value("${spring.datasource.dynamic.mysql.username}")
        private String username;
        @Value("${spring.datasource.dynamic.mysql.password}")
        private String password;    
    
    }
    

    写完之后整整齐齐,帅!

    如果有人觉得帅,一定还没成长成一个合格的程序员。

    我们程序员追求什么?

    优雅。

    优雅永不过时。

    优雅最重要的一条原则是什么?

    不写重复代码!

    所以怎么办?

    有办法。

    下面我们讲一下 @ConfigurationProperties 。

    作用

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

    使用方式一:@Component

    直接上代码:

    @Component
    @ConfigurationProperties(prefix = "spring.datasource.dynamic.mysql")
    @Data
    public class DynamicDataSourceConfig {
        
        private String driverClassName;
        private String url;
        private String username;
        private String password;    
    
    }
    

    写完之后清清爽爽,帅!

    我们发现了几个关键点:

    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一起使用。

    上代码:

    @ConfigurationProperties(prefix = "father")
    @Data
    public class Father {
       private String name;
    }
    
    @Configuration
    @EnableConfigurationProperties(Father.class)
    public class MainConfig {
    }
    

    实际开发中可能更多的写在 Application 启动类上。

    这时候 A 同学问了:

    那启动类上没有 @Configuration 啊?

    有的,@SpringBootApplication 也是一个@Configuration。

    又有 B 同学问了:

    那我有两个配置类怎么写呢?

    哎?好办。

    @Configuration
    @EnableConfigurationProperties(Father.class, Son.class)
    public class MainConfig {
    }
    

    又有 C 同学问了:

    那我有 100 个配置类呢?

    聪明的 B 同学说:

    我知道我知道!

    @Configuration
    @EnableConfigurationProperties(Father.class, Son.class, GrandSon.class, GrandgrandSon.class...)
    public class MainConfig {
    }
    

    ...

    不愧是你。

    那怎么办呢?

    也有办法。

    使用方式三:@ConfigurationPropertiesScan

    SpringBoot 2.2.0版本以后提供了这个注解。

    这个注解加到启动类上,注明包路径。

    系统就会扫描这个包路径下的所有包含 @ConfigurationProperties 注解的配置类。

    如果不写包路径,就默认扫描启动类所在包及其子包。

    这样就不用写一百个类了。

    @SpringBootApplication
    @ConfigurationPropertiesScan
    public class DemoAnnotationApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoAnnotationApplication.class, args);
        }
    }
    

    差不多了吧?

    什么?小明,你有话说?

    那既然 @Component 能注册成 Bean,那我使用 @Configuration 加 @Bean 注册又怎么说?

    卧槽,还有高手?

    使用方式四:@Bean

    @Data
    public class Animal {
        private String name;
    }
    
    @Configuration
    public class MainConfig {
        @Bean
        @ConfigurationProperties(prefix = "animal")
        public Animal getAnimalBean() {
            return new Animal();
        }
    }
    
    animal.name=Wangcai
    

    还有高手吗?

    下课!


    联系我:

    https://stanezhang.github.io/

  • 相关阅读:
    阿里开源低代码引擎 - Low-Code Engine
    k8s部署手册-v06
    安装依赖报错
    [数学建模]---1.层次分析法matlab&python
    PostgreSQL数据库统计信息——acquire_sample_rows采样函数
    Java Spring MVC 中使用JdbcTemplate示例
    LeetCode(23)找出字符串中第一个匹配项的下标【数组/字符串】【简单】
    2024年6月四六级考试复盘
    黑群晖 7.0 安装
    GO语言里的Log4j
  • 原文地址:https://www.cnblogs.com/cosimo/p/17945030