Spring配置文件和Java配置

我的上一个博客介绍了Spring 3.1的配置文件,并解释了使用它们的业务案例,并演示了它们在Spring XML配置文件中的用法。 但是,似乎很多开发人员更喜欢使用Spring的基于Java的应用程序配置,因此Spring设计了一种使用带有现有@Configuration批注的配置文件的方法。

我将使用我以前的博客中的Person类来演示配置文件和@Configuration批注。 这是一个简单的bean类,其属性取决于激活的概要文件而有所不同。

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; } 
}

请记住,Spring专家建议仅在需要加载不同类型或类集的情况下使用Spring配置文件,并且在设置属性时应继续使用PropertyPlaceholderConfigurer 。 我违反规则的原因是我想尝试编写最简单的代码来演示配置文件和Java配置。

使用Spring配置文件和Java配置的核心是Spring的新@Profile注释。 @Profile批注用于将配置文件名称附加到@Configuration批注。 它采用一个可以以两种方式使用的参数。 首先,将单个配置文件附加到@Configuration批注:

@Profile("test1")

其次,附加多个配置文件:

@Profile({ "test1", "test2" })

同样,我将定义两个配置文件“ test1”和“ test2”,并将每个配置文件与一个配置文件相关联。 首先是“ test1”:

@Configuration 
@Profile("test1") 
public class Test1ProfileConfig { @Bean public Person employee() { return new Person("John", "Smith", 55); } 
}

…然后是“ test2”:

@Configuration 
@Profile("test2") 
public class Test2ProfileConfig { @Bean public Person employee() { return new Person("Fred", "Williams", 22); } 
}

在上面的代码中,您可以看到我正在创建一个Person Bean,其有效的雇员 ID(来自方法名)在每个概要文件中返回不同的属性值。

另请注意,@ Profile被标记为:

@Target(value=TYPE)

…这意味着只能将其放在@Configuration批注旁边。

@Profile附加到@Configuration后 ,下一步是激活您选择的@Profile 。 这使用了与我在上一个博客中描述的原理和技术完全相同的方法,并且在我看来,最有用的激活技术是使用“ spring.profiles.active”系统属性。

@Test public void testProfileActiveUsingSystemProperties() { System.setProperty("spring.profiles.active", "test1"); ApplicationContext ctx = new ClassPathXmlApplicationContext("profiles-config.xml"); Person person = ctx.getBean("employee", Person.class); String firstName = person.getFirstName(); assertEquals("John", firstName); }

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

-Dspring.profiles.active="test1"

…或通过添加

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

到Tomcat的catalina.properties

所以,这就是全部:您可以通过使用@Profile注释对@Configuration进行注释来创建Spring配置文件,然后通过将spring.profiles.active系统属性设置为配置文件的名称来打开要使用的配置文件

像往常一样,Spring的伙计们不仅将您限制在使用系统属性来激活配置文件中,还可以以编程方式进行操作。 例如,下面的代码创建AnnotationConfigApplicationContext ,然后在注册我们的@Configuration类之前,使用Environment对象激活“ test1”配置文件。

@Test public void testAnnotationConfigApplicationContextThatWorks() { // Can register a list of config classes AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.getEnvironment().setActiveProfiles("test1"); ctx.register(Test1ProfileConfig.class, Test2ProfileConfig.class); ctx.refresh(); Person person = ctx.getBean("employee", Person.class); String firstName = person.getFirstName(); assertEquals("John", firstName); }

一切都很好,但是请注意,您需要以正确的顺序调用AnnotationConfigApplicationContext的方法。 例如,如果您在指定配置文件之前注册@Configuration类,则将收到IllegalStateException

@Test(expected = IllegalStateException.class) public void testAnnotationConfigApplicationContextThatFails() { // Can register a list of config classes AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( Test1ProfileConfig.class, Test2ProfileConfig.class); ctx.getEnvironment().setActiveProfiles("test1"); ctx.refresh(); Person person = ctx.getBean("employee", Person.class); String firstName = person.getFirstName(); assertEquals("John", firstName); }

在关闭今天的博客之前,下面的代码演示了将多个@Profiles附加到@Configuration批注的功能。

@Configuration 
@Profile({ "test1", "test2" }) 
public class MulitpleProfileConfig { @Bean public Person tourDeFranceWinner() { return new Person("Bradley", "Wiggins", 32); } 
}
@Test public void testMulipleAssignedProfilesUsingSystemProperties() { System.setProperty("spring.profiles.active", "test1"); ApplicationContext ctx = new ClassPathXmlApplicationContext("profiles-config.xml"); Person person = ctx.getBean("tourDeFranceWinner", Person.class); String firstName = person.getFirstName(); assertEquals("Bradley", firstName); System.setProperty("spring.profiles.active", "test2"); ctx = new ClassPathXmlApplicationContext("profiles-config.xml"); person = ctx.getBean("tourDeFranceWinner", Person.class); firstName = person.getFirstName(); assertEquals("Bradley", firstName); }

在上面的代码中,2012年环法自行车赛冠军布拉德利·威金斯同时出现在“ test1”和“ test2”个人资料中。  

参考: Spring,来自JCG合作伙伴 Roger Hughes的Enterprise Java ,在Captain Debug的Blog博客中。


翻译自: https://www.javacodegeeks.com/2012/08/spring-profiles-and-java-configuration.html

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

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

相关文章

php 删除单个文件大小,php删除指定大小的jpg文件

function actionZmdel(){//set_time_limit(0);$dir dirname(dirname(dirname(dirname(__FILE__))))./2012jxgwyimg;$dirarr scandir($dir);echo 正在删除...;foreach($dirarr as $subdir){if($subdir ! . && $subdir ! ..){$path $dir./.$subdir;$files glob($path…

2017寒假零基础学习Python系列之函数之 函数之定义可变参数

若想让函数接受任意个参数,就可以定义一个可变的参数: def fn(*args): print args fn() >>>() fn(1,2,5,6) >>>(1,2,5,6) 原理是Python解释器把传入的一组参数封装在一个tuple传递给可变参数,因此在函数内部,直…

在Windows上构建OpenJDK

通过做一些实验,我发现手头提供JDK源代码来进行一些更改,使用它等等通常很有用。因此,我决定下载并编译该野兽。 显然,这花了我一些时间,尽管我最初的想法是,它应该和运行make命令一样简单:&…

unity中怎么在InspectorI面板加LOGO

转载于:https://www.cnblogs.com/unitySPK/p/7278925.html

oracle stream 主键,oracle stream配置向导

1. Stream 的工作原理Stream 是Oracle Advanced Queue技术的一种扩展应用,这种技术最基本的原理就是收集事件,把时间保存在队列中,然后把这些事件发布给不同的订阅者。从DBA的角度来说,就是把捕获Oracle数据库产生的Redo日志&…

JavaScriptDOM 十四. Event DOM的属性

1 <!DOCTYPE html>2 <html>3 <head>4 <title></title>5 <script type"text/javascript">6 7 /*8 1. --------------- Event DOM 事件DOM 用户交互 ------------------9 当事件发生时, 执行JS功能代码10 11 常用…

五、创建Bean的三种方式

五、创建Bean的三种方式转载于:https://www.cnblogs.com/ljiwej/p/7280614.html

重写到边缘–充分利用它! 在GlassFish上!

现代应用程序开发的一个重要主题是重写。 自从Java Server Faces引入和Java EE 6中新的轻量级编程模型以来&#xff0c;您一直在努力使用漂亮&#xff0c;简单&#xff0c;可添加书签的URL。 PrettyFaces很久以来就一直存在&#xff0c;即使它在3.3.3版本中可以说是成熟的&…

php yii框架路由,yii框架路由配置

首先要在服务器配置(httpd.conf)中开启重写模块#开启重写模块&#xff0c;将其前面的#去掉LoadModule rewrite_module modules/mod_rewrite.so#Directory中允许覆盖开启## Possible values for the Options directive are "None", "All",# or any combinat…

前端面试总结二

一、响应式和自适应的区别&#xff1a; 联系(相同点)&#xff1a; 响应式设计(responsive design)和自适应设计(adaptive design)都是用来解决网页在不同分辨率的屏幕和设备上展示的一项技术(或者说一种方法)。 区别&#xff1a; 响应式设计&#xff1a;通过CSS Media Queries(…

“Spring入门”教程系列

大家好&#xff0c; 我很高兴向您介绍“Spring入门”教程系列&#xff01; 这是一系列文章&#xff0c;最初由我们的JCG合作伙伴 Michal Vrtiak在vrtoonjava博客上撰写 。 本系列中将逐步创建一个时间表管理应用程序&#xff0c;并且每个教程都在前一个教程的基础上构建。 处…

【看番杂感】Clannad系列观后感(剧透慎入)

前言 之前看第一季时&#xff0c;弹幕里总有人在刷“写作cl&#xff0c;读作人生”。当时我想&#xff0c;盲目把一部催泪番上升到人生的高度&#xff0c;这未免有些武断&#xff0c;也是对作品本身的不尊重。当看完第二季的我蓦然回首&#xff0c;发现这才是最最贴切的评价&am…

oracle+tns+01106,TNS-01106:Listener using listener name already been started

最近在做HACMP双机互备切换测试的时候&#xff0c;发现一个问题&#xff1a;A节点的listener端口为1521 &#xff0c;B节点的listener端口为1522&#xff0c;为什么两个节点的监听要用不同的端口号&#xff1f;当时AB机使用不同端口是基于如下考虑&#xff1a;HACMP的切换数据库…

Centos7 开机显示 ERST: Failed to get Error Log Address Range” 导致无法开机解决方法

开机显示 ERST: Failed to get Error Log Address Range” 导致无法开机&#xff0c;也无法重新安装系统&#xff0c;解决方法&#xff1a;开机进入BIOS &#xff0c; 关闭ACPI选项即可正常开机 转载于:https://www.cnblogs.com/zhangjianghua/p/6376811.html

Spring MVC 3模板和Apache Tiles

对于任何Web应用程序而言&#xff0c;有效的设计考虑因素是使用模板引擎&#xff08;或工具&#xff09;&#xff0c;并且由于具有Spring的“可插拔”特性&#xff0c;因此集成模板机制&#xff08;例如Apache Tiles&#xff09;的确要容易得多。 在这篇简单的文章中&#xff0…

hihocoder1543 SCI表示法

题意&#xff1a;任何一个数可以表示为连续整数相加&#xff0c;问这些连续整数的最大长度 题解&#xff1a;假设左右是l,r,那么(lr)*(l-r1)/2就是这段序列的和&#xff0c;枚举2n的所有因子&#xff0c;找到最大的就可以了 我的做法是预处理前缀和&#xff0c;二分找到答案位置…

linux自动安装Java环境脚本,Linux 自动添加JAVA环境脚本

Linux 自动添加JAVA环境脚本1. 删除原有的JAVA环境变量配置### --------------delete old config -------------------- ###sed -i -e /JAVA_HOME/d -e /JRE/d /etc/profile删除包含JAVA_HME 、JRE的行2. 加入现有的JAVA环境变量配置### -------------- add new config ----…

辗转相除法的证明

辗转相除法的证明设两数为a、b(b&#xff1c;a)&#xff0c;求它们最大公约数的步骤如下&#xff1a;用b除a&#xff0c;得a&#xff1d;bq&#xff0b;r&#xff08;0≤r&#xff1c;b&#xff09;&#xff08;q是这个除法的商&#xff09;。若r0,则b是a和b的最大公约数。若r≠…

linux查看有几个终端命令,如何知道你在 Linux 里最常使用的几个命令?

不知道大家自接触 Linux 以来&#xff0c;都使用过哪些命令&#xff0c;其中最常用的命令是什么&#xff1f;我最常用的命令之一是 sudo &#xff0c;因为我每天都在使用它在 Linux 上安装、更新、删除软件包以及其它各种需要超级用户权限的操作。那么你知道你自己最经常使用的…

使用JUnit的ExpectedException和@Rule测试自定义异常

异常测试 为什么要测试异常流&#xff1f; 就像所有代码一样&#xff0c;测试覆盖率会在代码和应该生成的业务功能之间写一个合同&#xff0c;从而为您提供代码的有效文档 &#xff0c;以及增加的尽早且经常强调功能的功能。 我不会介绍测试的许多好处&#xff0c;而是只关注异…