前言
在Spring的开发中,我们在很多情况下会使用占位符引用属性文件的属性值来简化我们的系统及使我们的系统具有更高的灵活性和通用性。这种配置方式有两个明显的好处:
- 减少维护的工作量:资源的配置信息可以多应用共享,在多个应用使用同一资源的情况下,如果资源的地址、用户名等配置信息发生了更改,你只要调整属性文件就可以了;
- 使部署更简单:Spring配置文件主要描述应用程序中的Bean,这些配置信息在开发完成后,应该就固定下来了,在部署应用时,需要根据部署环境调整是就是数据源,邮件服务器的配置信息,将它们的配置信息独立到属性文件中,应用部署人员只需要调整资源属性文件即可,根本不需要关注内容复杂的Spring配置文件。不仅给部署和维护带来了方便,也降低了出错的机率。
Spring为我们提供了一个BeanFactoryPostProcessorBean工厂后置处理器接口的实现类:org.springframework.beans.factory.config.PropertyPlaceholderConfigurer,它的主要功能是对引用了外部属性值的<bean>进行处理,将其翻译成真实的配置值。
一般的属性信息以明文的方式存放在属性文件中并没有什么问题,但如果是数据源或邮件服务器用户名密码等重要的信息,在某些场合,我们可能需要以密文的方式保存。虽然Web应用的客户端用户看不到配置文件的,但有时,我们只希望特定的维护人员掌握重要资源的配置信息,而不是毫无保留地对所有可以进入部署机器的用户开放。
对于这种具有高度安全性要求的系统(如电信、银行、重点人口库等),我们需要对资源连接等属性配置文件中的配置信息加密存放。然后让Spring容器启动时,读入配置文件后,先进行解密,然后再进行占位符的替换。
很可惜,PropertyPlaceholderConfigurer只支持明文的属性文件。但是,我们可以充分利用Spring框架的扩展性,通过扩展PropertyPlaceholderConfigurer类来达到我们的要求。本文将讲解使用加密属性文件的原理并提供具体的实现。
以传统的方式使用属性文件
一般情况下,外部属性文件用于定义诸如数据源或邮件服务器之类的配置信息。这里,我们通过一个简单的例子,讲解使用属性文件的方法。假设有一个car.properties属性文件,文件内容如下:
brand=红旗CA72
maxSpeed=250
price=20000.00
该文件放在类路径的com/baobaotao/目录下,在Spring配置文件中利用PropertyPlaceholderConfigurer引入这个配置文件,并通过占位符引用属性文件内的属性项,如代码清单 1所示:
代码清单 1 使用外部属性文件进行配置
<!-- ① 引入外部属性文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:com/baobaotao/car.properties</value> ② 指定属性文件地址
</list>
</property>
<property name="fileEncoding" value="utf-8"/>
</bean>
<!-- ③ 引用外部属性的值,对car进行配置 -->
<bean id="car" class="com.baobaotao.place.Car">
<property name="brand" value="${brand}" />
<property name="maxSpeed" value="${maxSpeed}" />
<property name="price" value="${price}" />
</bean>
在①处,我们通过PropertyPlaceholderConfigurer这个BeanFactoryPostProcessor实现类引用外部的属性文件,通过它的locations属性指定Spring配置文件中引用到的属性文件,在PropertyPlaceholderConfigurer内部,locations是一个Resource数组,所以你可以在地址前添加资源类型前缀,如②处所示。如果需要引用多个属性文件,只需要在②处添加相应<value>配置项即可。
分析PropertyPlaceholderConfigurer结构
我们知道Spring通过PropertyPlaceholderConfigurer提供对外部属性文件的支持,为了使用加密的属性文件,我们就需要分析该类的工作机理,再进行改造。所以我们先来了解一下该类的结构(见附件1)。
其中PropertiesLoaderSupport类有一个重要的protected void loadProperties(Properties props)方法,查看它的注释,可以知道该方法的作用是将PropertyPlaceholderConfigurer 中locations属性所定义的属性文件的内容读取到props入参对象中。这个方法比较怪,Java很少通过入参承载返回值,但这个方法就是这样。
所以,我们只要简单地重载这个方法,在将资源文件的内容转换为Properties之前,添加一个解密的步骤就可以了。但是,PropertiesLoaderSupport的设计有一个很让人遗憾的地方,它的locations属性是private的,只提供setter没有提供getter。因此,无法在子类中获取PropertiesLoaderSupport中的locations(资源地址),所以我们得在子类重新定义locations属性并覆盖PropertiesLoaderSupport中的setLocations()方法。
- 描述: PropertyPlaceholderConfigurer 结构图
- 大小: 21.8 KB
分享到:
相关推荐
《ProSpring——Spring专业开发指南》是一本深入探讨Spring框架的专业书籍,旨在帮助开发者全面理解和掌握Spring的核心概念、功能及最佳实践。通过阅读本书,你可以深入理解Spring如何为Java应用程序提供强大的依赖...
本笔记将专注于Spring框架中的一个关键特性——通过`property-placeholder`使用外部属性文件,这在实际项目中非常常见,能够有效地实现配置的解耦和管理。 首先,让我们理解`property-placeholder`的概念。在Spring...
控制反转是一种设计思想,它改变了传统的对象创建方式,将对象的创建和管理权从应用程序自身转移到一个外部的容器,比如Spring的IOC容器。在没有IOC的情况下,开发者需要在代码中直接创建对象并管理它们的依赖关系,...
Spring 是一个广泛应用于企业级 Java 开发的开源框架,由 Rod Johnson 创建,旨在简化 Java EE 应用的复杂性。它以轻量级、低侵入式的设计理念,提供了全面的解决方案,涵盖从表现层到业务逻辑层再到持久层的各个...
1. **依赖注入**:Spring的DI允许开发者通过外部配置文件来管理对象之间的依赖关系,而不是在代码中硬编码这些依赖。这种方式使得代码更加灵活,易于测试和维护,因为对象的创建和配置是解耦的。 2. **面向切面编程...
依赖注入是一种设计模式,其核心思想是将对象之间的依赖关系从代码中分离出来,由外部容器(如Spring框架)负责管理对象的创建和装配,而不是由对象自身负责。这样可以提高代码的可测试性、可维护性和灵活性。 二、...
根据给定的文件信息,以下是对Spring.NET框架的详细介绍及相关知识点: ### 动机与背景 Spring.NET 是一个为.NET平台开发的应用程序框架,旨在简化企业级应用的开发过程。随着系统规模的增长,传统的“即兴”式...
Spring 框架是 Java EE 开发中的一个核心组件,它是一个开源的框架,旨在简化应用程序的构建和管理。Spring 的主要特点在于其轻量级特性,基础版本仅约2MB,以及它所实现的控制反转(IOC)和面向切面编程(AOP)原则...
IOC是一种设计模式,它的主要思想是将对象的创建和管理的权利从对象自身转移到外部容器,即Spring框架。通过XML配置文件或注解方式,Spring可以决定哪些对象实例化,何时实例化,以及如何实例化。这样,对象间的...
在深入探讨Spring框架之前,我们需要理解其核心概念之一——控制反转(Inversion of Control, IoC)。这一概念最初由Martin Fowler提出,并被赋予了一个更为贴切的名字——依赖注入(Dependency Injection, DI)。...
具体到文件名 "sse2",这可能是 Struts 2、Spring 和 EJB 整合项目的一个简写,可能包含了配置文件、源代码、部署描述符等内容。这些文件可以帮助开发者了解如何在实际项目中集成这三个框架,包括但不限于: 1. `...
5. 自定义监控:用户可以通过扩展Spring Boot Actuator的端点或者自定义HealthIndicator来添加自己的监控项。 描述中提到的博文链接(由于无法访问,具体内容未知),可能提供了关于如何配置和使用Spring Boot ...
而在Spring中,这种依赖关系的管理被转移到了一个外部容器中,即Spring容器。 - **Spring容器**:Spring容器负责实例化、定位和配置对象及其依赖关系。 - **Bean Factory**:是最基本的容器,提供了配置和管理bean的...
Spring支持从外部文件中读取配置信息,这些配置信息可以是属性文件、JSON文件或其他格式。常见的注入方式包括: 1. **Java配置**:使用`@PropertySource`注解和`Environment`接口。 2. **XML配置**:使用`...
Spring框架是一个开源的Java平台,它提供了一个全面的编程和配置模型,用于现代基于Java的企业应用程序——在任何类型的部署平台上。Spring的模块化结构允许开发者只使用他们需要的部分,而忽略不需要的部分。Spring...
Spring框架是Java开发中不可或缺的一部分,它通过提供两种核心特性——控制反转(IoC)和面向切面编程(AOP)来简化应用的构建。理解并掌握这两种技术对于任何Java开发者来说都至关重要。 **控制反转(IoC)**,也...
首先,我们需要理解Spring框架的核心概念——依赖注入(Dependency Injection,简称DI)。依赖注入是Spring提供的一种设计模式,它允许我们解耦组件之间的依赖关系,提高代码的可测试性和可维护性。在工作流的上下...
《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...