Spring中两种常用的容器后处理器

    容器后处理器是一种特殊的Bean,这种Bean并不对外提供服务,它甚至可以无需id属性,它主要负责对容器本身进行某些特殊的处理。

PropertyPlaceholderConfigurer后处理器

    PropertyPlaceholderConfigurer是Spring提供的一个容器后处理器,负责读取properties属性文件里的属性值,并将这些属性值设置成Spring配置文件的元数据。通过使用PropertyPlaceholderConfigurer,可以将Spring配置文件中的部分元数据放在属性文件中设置,这种配置方式当然有其优势:可以将部分相似的配置(比如数据库的URL,用户名和密码等)放在特定的属性文件中,如果只需要修改这部分配置,则无需修改Spring配置文件。例如:

1<bean class="org.springframework.beans.factory.PropertyPlaceholderConfigurer"> 2    <property name="locations"> 3        <list> 4            <!-- 如果有多个属性文件,一并列在这里 --> 5            <value>db.properties</value> 6            <!-- <value>xxx.properties</value> --> 7        </list> 8    </property> 9</bean> 10<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 11    <!-- 以下这些值均来自配置文件dp.properties --> 12    <property name="driverClass" value="${jdbc.driverClass}" /> 13    <property name="jdbcUrl" value="${jdbc.url}" /> 14    <property name="user" value="${jdbc.user}" /> 15    <property name="password" vaue="${jdbc.password}" /> 16</bean> 17<!-- 18    other beans' definition 19-->

    在上面的配置文件中,dataSouce的几个连接属性的value都来自属性文件中,这表明Spring容器将从propertyConfigurer指定属性文件中搜索这些key对应的value,并为对应的Bean属性设置这些value。

    注意:如果使用以下方式使用容器,是不需要为PropertyPlaceholderConfigurer配置id,也不需要手动为容器注册这个后处理器,因为ApplicationContext可自动检测到容器中的后处理器,并自动注册:

1ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 2context.getBean("xxx");

    本例用到的属性文件dp.properties内容如下:

1jdbc.driverClass=com.mysql.jdbc.Driver 2jdbc.url=jdbc:mysql://localhost:3306/testdb 3jdbc.user=root 4jdbc.password=123456

PropertyOverrideConfigurer后处理器

    PropertyOverrideConfigurer是Spring提供的另一个容器后处理器,这个后处理器的作用比上面那个后处理器更加强大:PropertyOverrideConfigurer的属性文件指定的信息可以直接覆盖Spring配置文件中的元数据,看例子:

1<bean class="org.springframework.beans.factory.PropertyOverrideConfigurer"> 2    <property name="locations"> 3        <list> 4            <!-- 如果有多个属性文件,一并列在这里 --> 5            <value>db.properties</value> 6            <!-- <value>xxx.properties</value> --> 7        </list> 8    </property> 9</bean> 10<!-- 这个dataSource没有指定属性值,但properties文件中的数据将会直接覆盖dataSource中的值 --> 11<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" /> 12<!-- 13    other beans' definition 14-->

    上面的dataSource没有指定任何信息,但是因为Spring容器中部署了一个PropertyOverrideConfigurer的容器后处理器,而且Spring使用ApplicationContext作为容器,它将自动检测容器中的后处理器并自动注册。PropertyOverrideConfigurer读取db.properties文件中的属性后,找到beans.xml文件中匹配的属性,并将其值替换掉。因此只要db.properties中的属性的定义格式为:dataSource.propertyName=value时,这些值就可以被后处理器读取后覆盖原来的空值,否则程序将出错。属性文件的内容如下:

1dataSource.driverClass=com.mysql.jdbc.Driver 2dataSource.url=jdbc:mysql://localhost:3306/testdb 3dataSource.user=root 4dataSource.password=123456
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )