XML配置文件中的Spring配置文件

我的上一个博客非常简单,因为它涵盖了我从Spring 3.0.x到Spring 3.1.x的轻松升级,最后我提到可以将Spring模式升级到3.1,以利用Spring的最新功能。 在今天的博客中,我将介绍这些功能中最酷的功能之一:Spring配置文件。 但是,在谈论如何实现Spring配置文件之前,我认为探索它们正在解决的问题是一个好主意,这是需要为不同的环境创建不同的Spring配置。 之所以会出现这种情况,通常是因为您的应用程序在其开发生命周期中需要连接到多个类似的外部资源,并且连接频率更高,而且这些“外部资源”通常不是数据库,尽管它们可以是JMS队列,Web服务,远程EJB等。

您的应用程序在运行之前必须工作的环境数量通常取决于几件事,包括您组织的业务流程,应用程序的规模以及它的“重要性”(即,如果您正在编写税收表)系统为您的国家/地区提供税收服务,那么测试过程可能比为本地商店编写电子商务应用程序时更为严格。 为使您有所了解,以下是想到的所有不同环境的快速列表(可能不完整):

  1. 本地开发者机器
  2. 开发测试机
  3. 测试团队功能测试机
  4. 集成测试机
  5. 克隆环境(实时副本)
  6. 生活

这不是一个新问题,通常可以通过为每个环境创建一组Spring XML和属性文件来解决。 XML文件通常包含一个导入其他环境特定文件的主文件。 然后在编译时将它们耦合在一起以创建不同的WAR或EAR文件。 这种方法已经使用了多年,但确实存在一些问题:

  1. 这是非标准的。 每个组织通常都有自己的解决方法,没有两种方法可以完全相同/
  2. 很难实现,为错误留出了很大的空间。
  3. 必须为每个环境创建一个不同的WAR / EAR文件并将其部署在每个环境上,这需要花费时间和精力,而花更多的时间编写代码可能更好。

Spring bean配置中的差异通常可以分为两部分。 首先,存在特定于环境的属性,例如URL和数据库名称。 通常使用PropertyPlaceholderConfigurer类和相关的$ {}标记将它们注入到Spring XML文件中。

<bean id='propertyConfigurer' class='org.springframework.beans.factory.config.PropertyPlaceholderConfigurer'><property name='locations'><list><value>db.properties</value></list></property></bean>

其次,有特定于环境的bean类,例如数据源,它们通常根据您连接数据库的方式而有所不同。

例如,在开发中,您可能具有:

<bean id='dataSource' class='org.springframework.jdbc.datasource.DriverManagerDataSource'><property name='driverClassName'><value>${database.driver}</value></property><property name='url'><value>${database.uri}</value></property><property name='username'><value>${database.user}</value></property><property name='password'><value>${database.password}</value></property></bean>

…无论是测试还是现场直播,您都可以简单地写:

<jee:jndi-lookup id='dataSource' jndi-name='jdbc/LiveDataSource'/>

Spring准则指出,仅应在上面的第二个示例中使用Spring概要文件:特定于Bean的类,并且您应继续使用PropertyPlaceholderConfigurer初始化简单的Bean属性; 但是,您可能希望使用Spring配置文件将特定于环境的PropertyPlaceholderConfigurer注入到Spring上下文中。

话虽如此,我将在示例代码中打破这一约定,因为我想用最简单的代码来演示Spring配置文件的功能。

Spring配置文件和XML配置
在XML配置方面,Spring 3.1在spring-beans模式的bean元素中引入了新的profile属性:

<beans profile='dev'>

当在不同环境中启用和禁用配置文件时,此配置文件属性充当开关。

为了进一步解释所有这些,我将使用一个简单的想法,即您的应用程序需要加载一个人员类,并且该人员类包含不同的属性,具体取决于您的程序在其上运行的环境。

Person类非常简单,看起来像这样:

public class Person {private final String firstName;private final String lastName;private final int age;public Person(String firstName, String lastName, int age) {this.firstName = firstName;this.lastName = lastName;this.age = age;}public String getFirstName() {return firstName;}public String getLastName() {return lastName;}public int getAge() {return age;}}

…并在以下XML配置文件中定义:

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd'profile='test1'><bean id='employee' class='profiles.Person'><constructor-arg value='John' /><constructor-arg value='Smith' /><constructor-arg value='89' /></bean>
</beans>

…和

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd'profile='test2'><bean id='employee' class='profiles.Person'><constructor-arg value='Fred' /><constructor-arg value='ButterWorth' /><constructor-arg value='23' /></bean>
</beans>

…分别称为test-1-profile.xmltest-2-profile.xml (请记住这些名称,它们在以后很重要)。 如您所见,配置的唯一区别是名字,姓氏和年龄属性。

不幸的是,仅仅定义个人资料还不够,您必须告诉Spring您正在加载哪个个人资料。 这意味着遵循旧的“标准”代码现在将失败:

@Test(expected = NoSuchBeanDefinitionException.class)public void testProfileNotActive() {// Ensure that properties from other tests aren't setSystem.setProperty('spring.profiles.active', '');ApplicationContext ctx = new ClassPathXmlApplicationContext('test-1-profile.xml');Person person = ctx.getBean(Person.class);String firstName = person.getFirstName();System.out.println(firstName);}

幸运的是,有几种选择配置文件的方法,在我看来,最有用的方法是使用“ spring.profiles.active”系统属性。 例如,以下测试现在将通过:

System.setProperty('spring.profiles.active', 'test1');ApplicationContext ctx = new ClassPathXmlApplicationContext('test-1-profile.xml');Person person = ctx.getBean(Person.class);String firstName = person.getFirstName();assertEquals('John', firstName);

显然,您不希望像我上面那样对事情进行硬编码,最佳实践通常意味着将系统属性定义与应用程序分开。 这使您可以选择使用简单的命令行参数,例如:

-Dspring.profiles.active='test1'

…或通过添加

# Setting a property value
spring.profiles.active=test1

到Tomcat的catalina.properties

因此,仅此而已:您可以使用bean元素配置文件属性创建Spring XML配置文件,并通过将spring.profiles.active系统属性设置为配置文件的名称来打开要使用的配置文件

获得一些额外的灵活性

但是,这还不是故事的结局,因为Spring的Guy已添加了许多以编程方式加载和启用配置文件的方法-如果您愿意的话。

@Testpublic void testProfileActive() {ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext('test-1-profile.xml');ConfigurableEnvironment env = ctx.getEnvironment();env.setActiveProfiles('test1');ctx.refresh();Person person = ctx.getBean('employee', Person.class);String firstName = person.getFirstName();assertEquals('John', firstName);}

在上面的代码中,我使用了新的ConfigurableEnvironment类来激活“ test1”配置文件。

@Testpublic void testProfileActiveUsingGenericXmlApplicationContextMultipleFilesSelectTest1() {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ConfigurableEnvironment env = ctx.getEnvironment();env.setActiveProfiles('test1');ctx.load('*-profile.xml');ctx.refresh();Person person = ctx.getBean('employee', Person.class);String firstName = person.getFirstName();assertEquals('John', firstName);}

但是,Spring专家们建议您使用GenericApplicationContext类而不是ClassPathXmlApplicationContextFileSystemXmlApplicationContext,因为这样可以提供更大的灵活性。 例如,在上面的代码中,我已经使用GenericApplicationContextload(...)方法使用通配符来加载许多配置文件:

ctx.load('*-profile.xml');

还记得以前的文件名吗? 这将同时加载test-1-profile.xmltest-2-profile.xml

配置文件还具有额外的灵活性,可让您一次激活多个。 如果看下面的代码,您会看到我正在激活我的test1test2配置文件:

@Testpublic void testMultipleProfilesActive() {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ConfigurableEnvironment env = ctx.getEnvironment();env.setActiveProfiles('test1', 'test2');ctx.load('*-profile.xml');ctx.refresh();Person person = ctx.getBean('employee', Person.class);String firstName = person.getFirstName();assertEquals('Fred', firstName);}

当心,在本示例中,我有两个标识为“ employee”的bean,并且无法分辨哪个是有效的,并且应该优先。 从我的测试中,我猜测读取的第二个覆盖或掩盖了对第一个的访问。 没关系,因为您不应该拥有多个具有相同名称的bean –激活多个配置文件时需要提防这一点。

最后,可以做的更好的简化之一是使用嵌套的<beans />元素。

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:context='http://www.springframework.org/schema/context'xsi:schemaLocation='http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd'><beans profile='test1'><bean id='employee1' class='profiles.Person'><constructor-arg value='John' /><constructor-arg value='Smith' /><constructor-arg value='89' /></bean></beans><beans profile='test2'><bean id='employee2' class='profiles.Person'><constructor-arg value='Bert' /><constructor-arg value='William' /><constructor-arg value='32' /></bean></beans></beans>

这消除了通配符和加载多个文件的所有繁琐处理,尽管是以最小的灵活性为代价的。

我的下一个博客通过查看与新的@Profile注释结合使用的@Configuration注释,总结了我对Spring概要文件的了解,等等。

参考:来自Captain Debug博客博客的JCG合作伙伴 Roger Hughes提供的在XML Config中使用Spring Profiles 。


翻译自: https://www.javacodegeeks.com/2012/08/spring-profiles-in-xml-config-files.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交大计算机专业怎样,计算机专业高校实力排名,上海交大第五,清华第二,第一毫无争议...

原标题&#xff1a;计算机专业高校实力排名&#xff0c;上海交大第五&#xff0c;清华第二&#xff0c;第一毫无争议计算机专业在近几年可谓是“大热”&#xff0c;众多考生抢破头也想当码农&#xff0c;背后的原因其实不难理解。互联网时代的到来&#xff0c;计算机早已渗透到…

python_day7 绑定方法与非绑定方法

在类中定义函数如果 不加装饰器 则默认 为对象作为绑定方法 如果增加 classmethod 是 以 类 作为绑定方法 增加 classmethod 是 非绑定方法&#xff0c;就是不将函数 绑定 ##################### class Foo: def func(self): print(self) classmethod def func…

Spring Security使用Hibernate实现自定义UserDetails

大多数时候&#xff0c;我们将需要在Web应用程序中配置自己的安全访问角色。 这在Spring Security中很容易实现。 在本文中&#xff0c;我们将看到最简单的方法。 首先&#xff0c;我们将在数据库中需要以下表格&#xff1a; CREATE TABLE IF NOT EXISTS mydb.security_role (…

python之路-面向对象

编程范式 编程是 程序 员 用特定的语法数据结构算法组成的代码来告诉计算机如何执行任务的过程 &#xff0c; 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合&#xff0c;正所谓条条大路通罗马&#xff0c;实现一个任务的方式有很多种不同的方式&#xff0c; 对这…

西安邮电大学计算机科学与技术有专硕吗,2020年西安邮电大学计算机学院考研拟录取名单及排名!...

20考研复试调剂群&#xff1a;4197552812020年西安邮电大学计算机学院硕士研究生招生复试成绩及综合排名各位考生&#xff1a;现将我院2020年硕士研究生招生复试成绩及综合排名公布(最终录取名单及新生学籍注册均以“全国硕士研究生招生信息公开平台”备案信息为准)&#xff0c…

用Java排序的五种有用方法

Java排序快速概述&#xff1a; 正常的列表&#xff1a; private static List VEGETABLES Arrays.asList("apple", "cocumbers", "blackberry");Collections.sort(VEGETABLES);output: apple, blackberry, cocumbers反向排序&#xff1a; pri…

[python]-数据科学库Numpy学习

一、Numpy简介&#xff1a; Python中用列表(list)保存一组值&#xff0c;可以用来当作数组使用&#xff0c;不过由于列表的元素可以是任何对象&#xff0c;因此列表中所保存的是对象的指针。这样为了保存一个简单的[1,2,3]&#xff0c;需要有3个指针和三个整数对象。对于数值运…

检测一个点, 是否在一个半圆之内的方法

demo: http://jsbin.com/lihiwigaso 需求: 一个圆分成分部分, 鼠标滑上不同的区域显示不同的颜色 思路: 先判断这个点是否在圆之内, 再判断是否在所在的三角形之内就可以了 所需要的全部源码: <!DOCTYPE html> <html> <head><meta charset"utf-8&quo…

计算机网络设备接地规范,网络机房防雷接地的四种方式及静电要求

编辑----河南新时代防雷由于计算机网络系统的核心设备都放置在网络机房内&#xff0c;因而网络机房防雷接地有了较高的环境要求&#xff0c;良好的接地系统是保证机房计算机及网络设备安全运行&#xff0c;以及工作人员人身安全的重要措施。直流地的接法通常采用网格地&#xf…

抓住尾部的StackOverFlowError

使用Java程序时可能要处理的一种更烦人的情况是StackOverFlowError&#xff0c;如果您有一个很好的可生产的测试用例&#xff0c;那么关于使用堆栈大小或设置条件断点/某种痕迹 。 但是&#xff0c;如果您有一个测试案例可能一次失败100次&#xff0c;或者像我的案例一样在AWTM…

Gunicorn配置部分的翻译

写在前面&#xff0c;虽然翻译得很烂&#xff0c;但也是我的劳动成果&#xff0c;转载请注明出处&#xff0c;谢谢。 Gunicorn版本号19.7.1 Gunicorn配置 概述 三种配置方式 优先级如下&#xff0c;越后的优先级越大 1.框架的设置&#xff08;现在只有paster在用这个&#xff0…

台式计算机风扇声音大怎么处理,如何解决电脑电源风扇声音大的问题?

现在的台式机一般用3到5年后&#xff0c;一些问题自然也就慢慢表现出来了。很多网友在使用电脑过程中都有电脑风扇声音大怎么办的问题&#xff0c;电脑风扇声音大就会让人觉得使用电脑很不舒服&#xff0c;怎么办好呢&#xff1f;出现重要的问题要如何解决好呢&#xff1f;现在…

jsp分页功能

http://blog.csdn.net/xiazdong/article/details/6857515转载于:https://www.cnblogs.com/Baronboy/p/6112403.html

Spring Security第1部分–具有数据库的简单登录应用程序

什么是Spring Security&#xff1f; Spring Security是一个提供安全解决方案的框架&#xff0c;可在Web请求级别和方法级别上处理身份验证和授权。 Spring安全性通过两种方式处理安全性。 一种是安全的Web请求&#xff0c;另一种是在URL级别限制访问。 Spring Security使用Serv…

计算机应用 winxp,2017年职称计算机考试模块WindowsXP试题

2017年职称计算机考试模块WindowsXP试题全国专业技术人员计算机应用能力考试是专业技术人员资格考试的一种。接下来应届毕业生小编为大家搜索整理了2017年职称计算机考试模块WindowsXP试题&#xff0c;希望大家有所帮助。1. Windows XP中删除某个文件的快捷方式【 A 】。A. 对原…

Python基础(8)_迭代器、生成器、列表解析

一、迭代器 1、什么是迭代 1 重复   2 下次重复一定是基于上一次的结果而来 1 l[1,2,3,4] 2 count0 3 while count < len(l): 4 print(l[count]) 5 count1 迭代举例2、可迭代对象 可进行.__iter__()操作的为可迭代对象 #print(isinstance(str1,Iterable)),判断str…

Angularjs2-EXCEPTION: Response with status: 200 Ok for URL:

利用jsonp跨域请求数居&#xff0c;报错 core.umd.js:3070 EXCEPTION: Response with status: 200 Ok for URL: 参考&#xff1a;stackoverflow 未解决。。。脑仁疼。。。有小伙伴也碰到过这个问题么&#xff1f; 16/11/30 问题解决 1.服务器端API允许跨域访问(返回的数据添加允…

图片无法删除要计算机管理员,存在桌面的图片删不掉,怎么处理?提示是需要管理员权限。...

将下面代码复制到记事本里&#xff0c;重命名为1.bat&#xff0c;然后打开&#xff0c;这时你右键图片会出现管理员取得所有权&#xff0c;然后取得所有权后再删除试试Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\runas]管理员取得所有权NoWorkingDirecto…

Java对象序列化的本机C / C ++类似性能

您是否曾经希望过像使用C 这样的本地语言将Java对象转换成字节流一样快的速度&#xff1f; 如果您使用标准的Java序列化&#xff0c;您可能会对性能感到失望。 Java序列化的目的是与尽可能快而紧凑地序列化对象的目的截然不同。 为什么我们需要快速紧凑的序列化&#xff1f; 我…

WebStrom Sass 编译配置 windows

第一步&#xff1a; 先安装Ruby下载 一路next 安装完成后打开开始菜单 打开后输入 gem install sass sass -v 出现版本号说明成功 第二部配置webstorm 在webstorm中settings中搜索file watchers工具&#xff0c;在此工具中添加一个scss的watcher 确定&#xff0c;打开一个scss…