美文网首页
Spring核心——官配BeanFactoryPostProce

Spring核心——官配BeanFactoryPostProce

作者: 零点145 | 来源:发表于2019-07-13 19:07 被阅读0次

    IoC功能扩展点这篇文章中介绍了BeanFactoryPostProcessor及其使用方法,本篇介绍Spring官方提供的典型BeanFactoryPostProcessor。

    占位符参数替换——PropertyPlaceholderConfigurer

    如果你的工程有很多配置内容放置到Java的标准配置文件*.properties中,当把Properties的内容整合到Spring中时就会用到PropertyPlaceholderConfigurer。PropertyPlaceholderConfigurer3个功能:

    将配置中${property-name}格式的占位符换为加载的*.properties文件中的内容。

    将配置中${property-name}格式的占位符替换为环境变量systemProperties(System.getProperty(key))中的内容。

    如果文件和环境中有相同的key,按照规则对数据进行合并。

    基本使用方法

    PropertyPlaceholderConfigurer继承了配置BeanFactoryPostProcessor接口,在IoC开始初始化Bean之前修改对应BeanDefinition。在使用时我们直接向容器添加一个PropertyPlaceholderConfigurer即可:

    <!-- 启用占位符替换需要引入PropertyPlaceholderConfigurer --><!-- 指定*.properties文件的路径 --><!-- 替换Bean中的内容 -->

    对应的config.properties文件中的内容:

    user.name='Alice'user.address='China'user.age=20

    除了直接引入一个Bean,可以通过全局上下文配置启动这一项功能:

    设置环境变量加载行为

    前面说了PropertyPlaceholderConfigurer除了会用*.properties文件中的参数去替换占位符的内容,还会使用环境变量(System.getProperty(key))中的参数去替换。如果一个参数在配置文件中和系统环境变量中都存在,那么默认会使用*.properties中的参数来替换配置中的占位符。可以使用PropertyPlaceholderConfigurer::systemPropertiesMode来修改这个行为。他接受3个参数:推荐大家加入java技术交流659270626,趁年轻,使劲拼,给未来的自己一个交代!

    PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_NEVER(0):从不加载环境变量中的参数。

    PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_FALLBACK(1):优先使用*.properties文件中的变量,如果不存在再使用环境变量中的。

    PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE(2):优先使用环境变量中的参数。

    可以这样设置:

    <!-- 优先使用环境变量中的参数 -->

    动态设置参数&动态替换类

    除了通过环境变量和*.properties配置文件引入参数,还可以直接写在XML的配置上:

    <!-- 加载资源文件位置 -->classpath:myProject/config.properties<!-- 动态添加配置参数 -->define.runtime.class=x.y.z.A<!-- 动态加载一个类 -->

    上面XML配置还展示了一个动态装载类的方法。

    按命名规则注入——PropertyOverrideConfigurer

    PropertyOverrideConfigurer就是在PropertyPlaceholderConfigurer的基础上扩展了一些功能节约一些写配置文件的时间。他可以让你不必在XML文件写占位符而直接注入数据。看下面的例子:

    通过<bean>标签引入了PropertyOverrideConfigurer类,然后有一个独立的User单例,以及将Cpu、Ram、Graphics单例组合到Pc中。

    <!-- 引入PropertyOverrideConfigurer --><!-- 配置Bean之间的组合关系 -->

    对应的*.properties配置是这样的:

    user.name=Alice

    user.address=china

    user.age=20

    pc.cpu.brand=AMD

    pc.graphics.brand=Nvdia

    pc.ram.brand=Kingston

    Cpu类的结构:

    packagechkui.springcore.example.xml.configoverride.entity;publicclassCpu{privateString brand;publicStringgetBrand(){returnbrand;}publicvoidsetBrand(String brand){this.brand = brand;}}

    这个时候PropertyOverrideConfigurer会根据容器中Bean的id或name来注入数据,比如*.properties配置中的"pc"就对应XML中的<bean id="pc">,接着pc中有一个域(成员变量)名为cpu那么它对应*.properties配置文件中"pc.cpu.",所以pc.cpu.brand=AMD的配置会告诉PropertyOverrideConfigurer向pc单例中的cpu实例的"brand"域注入数据"AMD"。

    所以使用PropertyOverrideConfigurer运行之后,不需要在XML使用${property-name}这样的参数它会按照id或name的结构注入数据,此时user.getName() == "Alice"。如果类的关系是这个多层的结构一样可以根据Properties的结构注入数据,例如 pc.getPc().getBrand() == "AMD"。

    相关文章

      网友评论

          本文标题:Spring核心——官配BeanFactoryPostProce

          本文链接:https://www.haomeiwen.com/subject/fnimkctx.html