• 关于 PropertyOverrideConfigurer PropertySourcesPlaceholderConfigurer


    关于 PropertyOverrideConfigurer PropertySourcesPlaceholderConfigurer

    前言

    它们是 Spring 提供的基础组件,用于将 bean 属性通过配置化动态赋值,比如本地配置文件等,乍一听有点类似 Spring Boot外部化配置 机制,我感觉这就是 外部化配置 思维的雏形

    PropertyOverrideConfigurer

    • 它是一种 PUSH 的处理方式,将配置中的属性主动推送(赋值)给 bean 实例
    • 它通过 beanName.property=value 的形式来给 bean 属性赋值,本质上是对 BeanDefinition PorpertyValues 的操作
    • 它看上去很接近 Spring BootConfigurationProperties 机制,当然功能远远没有后者强大

    demo

    public class PropertyOverrideConfigurerTest {
    
        @Test
        public void test() {
            AnnotationConfigApplicationContext context
                    = new AnnotationConfigApplicationContext(Config.class);
            Config.A bean = context.getBean(Config.A.class);
            System.out.println(bean.getName());
        }
    
        @Configuration
        static class Config {
    
            @Bean
            public PropertyOverrideConfigurer propertyOverrideConfigurer() {
                PropertyOverrideConfigurer propertyOverrideConfigurer = new PropertyOverrideConfigurer();
                propertyOverrideConfigurer.setLocation(new ClassPathResource("application.properties"));
                return propertyOverrideConfigurer;
            }
    
            @Bean
            public A a() {
                return new A();
            }
    
            static class A {
    
                private String name;
    
                public String getName() {
                    return name;
                }
    
                public void setName(String name) {
                    this.name = name;
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 示例中我们注册了一个 PropertyOverrideConfigurer,并为其指定配置文件路径 classpath:/application.properties
    • 同时注册了一个 bean 实例 A,并未为其指定 name 属性
    • 则此时我们可以在配置文件 classpath:/application.properties 中通过 a.name=xxx 为其指定属性
    • 很类似于 Spring BootConfigurationProperties,当然 ConfigurationProperties 支持的场景更加复杂灵活

    PropertySourcesPlaceholderConfigurer

    • PropertyOverrideConfigurer 相反,它是 PULL 的处理方式:通过 占位符bean 实例指定属性,然后从 PropertySources 中解析对应的属性
    • 其实类似机制的还有一个 PropertyPlaceholderConfigurer,但该类局限于指定的 配置源,已被标记为 @Deprecated
    • PropertySourcesPlaceholderConfigurer 的属性源即 Environment#propertySources,在 Spring Boot 中配合 外部化配置 就更加强大了
    • Spring Boot 默认自动装配的就是 PropertySourcesPlaceholderConfigurer,详情见 PropertyPlaceholderAutoConfiguration
    • 此类就不 demo 示例了,在任一 Spring Boot 工程下的 application.properties 中使用占位符就是此类场景

    总结

    • PropertyOverrideConfigurerPropertySourcesPlaceholderConfigurerSpring 提供的基础组件,用于实现 bean 属性和 配置源 的关联
    • PropertyOverrideConfigurer 是配置源 PUSHbean 属性的模式,有点类似于 Spring BootConfigurationProperties 机制
    • PropertySourcesPlaceholderConfigurer占位符 标识的 bean 属性从配置源 PULL 的机制,结合 Spring Boot外部化配置 更加强大,也是 Spring Boot 默认自动装配的实例
  • 相关阅读:
    UDP与TCP:了解这两种网络协议的不同之处
    Java IO 与 NIO:高效的输入输出操作探究
    sass基本使用总结
    MapStruct类型之间映射的实现
    (附源码)计算机毕业设计SSM基于的楼盘销售管理系统
    目标检测网络系列——YOLO V1
    设计模型之单例设计
    企业是否需要单独一套设备管理系统?
    【软考 系统架构设计师】软件架构设计⑤ 软件架构评估
    数学的魅力
  • 原文地址:https://blog.csdn.net/weixin_42189048/article/details/126450855