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
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
1月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
1月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
356 2
|
XML Java 数据格式
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
京东一面:spring ioc容器本质是什么? ioc容器启动的步骤有哪些?
|
6月前
|
XML Java 数据格式
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
9月前
|
XML Java 数据格式
Spring容器的本质
本文主要讨论Spring容器最核心的机制,用最少的代码讲清楚Spring容器的本质。
|
11月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
355 6
|
11月前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
277 1
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序