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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

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

PropertyPlaceholderConfigurer后处理器

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

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

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

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

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

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

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

PropertyOverrideConfigurer后处理器

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

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

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

?
1
2
3
4
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql: //localhost:3306/testdb
dataSource.user=root
dataSource.password= 123456
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
38 6
|
4月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
23天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
32 1
|
1月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
1月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
51 0
|
2月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
3月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
156 3
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
80 0
|
4月前
|
XML Java 数据格式
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
这篇文章详细介绍了Spring框架中IOC容器的Bean管理,特别是基于XML配置方式的实现。文章涵盖了Bean的定义、属性注入、使用set方法和构造函数注入,以及如何注入不同类型的属性,包括null值、特殊字符和外部bean。此外,还探讨了内部bean的概念及其与外部bean的比较,并提供了相应的示例代码和测试结果。
Spring5入门到实战------3、IOC容器-Bean管理XML方式(一)
|
4月前
|
XML Java 数据格式
Spring5入门到实战------5、IOC容器-Bean管理(三)
这篇文章深入探讨了Spring5框架中IOC容器的高级Bean管理,包括FactoryBean的使用、Bean作用域的设置、Bean生命周期的详细解释以及Bean后置处理器的实现和应用。
Spring5入门到实战------5、IOC容器-Bean管理(三)