关于 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;
            }
        }
    }
}
  • 示例中我们注册了一个 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 默认自动装配的实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值