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.pswp.cn/news/371574.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371574.shtml
英文地址,請注明出處:http://en.pswp.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;而是只關注異…