1. 程式人生 > >Spring的@Value註解在建構函式中應用的注意點

Spring的@Value註解在建構函式中應用的注意點

在改造一個之前的SpringMVC專案,重新使用SpringBoot的架構。
有一個自定義屬性讀取的轉換過程,這裡記錄一下。

SpringMVC下的屬性讀取

專案使用MongoDB資料庫,直接使用MongoDB-Driver中的MongoClient進行程式設計,建立MongoClient例項時,需要主機地址和埠號。
這個主機地址和埠號在開發環境、測試環境、生產環境是不同的,因此通過配置檔案進行了配置,然後再程式執行的時候讀取這些屬性。

pom中的Profile配置

<profiles>
        <!-- 開發環境,預設啟用 -->
        <profile
>
<id>dev</id> <properties> <mongo.host>localhost</mongo.host> <mongo.port>27017</mongo.port> </properties> <activation> <activeByDefault>true</activeByDefault
>
<!-- 這裡表示預設環境 --> </activation> </profile> <!-- 測試環境 --> <profile> <id>test</id> <properties> <mongo.host>localhost</mongo.host> <mongo.port>27017</mongo.port
>
</properties> </profile> <!-- 預上線環境 --> <profile> <id>pre</id> <properties> <mongo.host>localhost</mongo.host> <mongo.port>27017</mongo.port> </properties> </profile> <!-- 生產環境 --> <profile> <id>prd</id> <properties> <mongo.host>localhost</mongo.host> <mongo.port>27017</mongo.port> </properties> </profile> </profiles>

上面已經將真正的主機地址都替換為localhost,實際上各個環境下是不一致的。埠號使用預設埠號27017。

自定義屬性配置檔案

建立一個自定義屬性的配置檔案,譬如mongo.properties,寫入相關配置。

mongo.host = ${mongo.host}
mongo.port = ${mongo.port}

程式碼中讀取自定義屬性

ResourceBundle resource = ResourceBundle.getBundle("mongo");
String host = resource.getString("mongo.host");
String port = resource.getString("mongo.port");

這裡是通過ResourceBundle進行的讀取,這是一個可以根據本地環境讀取不同配置檔案的類,這裡我們簡單實用,不傳入locale,直接讀取唯一的配置檔案中的鍵值對即可。

如上,便是在SpringMVC專案中讀取自定義屬性的相關內容。

SpringBoot下自定義屬性注入

SpringBoot實現起來就比較簡潔一些了,可以使用@Value註解直接注入自定義屬性。

application.properteis配置

SpringBoot的配置一般都放在application.properties中,為了區分開發、測試、生產環境等,可以增加字尾生成各個環境下獨立的配置檔案,如下:
這裡寫圖片描述
而在各個properties中配置不同的值。
同時在pom中也要配置相應的Profile,這裡屬性配置一個env即可,然後再application.properties中通過如下的配置引入對應活動環境下的配置:

spring.profiles.active=${env}

程式碼中@Value注入

在程式碼中通過@Value可以直接把自定義的屬性值注入進去。

@Value("${mongodb.host}") 
String mongoHost;
@Value("${mongodb.port}") 
String mongoPort;

需要注意的地方

因為在專案中這些自定義的屬性需要在Spring Bean的建構函式中使用,所以這裡有一些不同。
上面的示例中是在Bean的成員變數上使用@Value進行了注入,而成員變數的注入按照個人的理解應該是在Bean建立成功之後,通過setter方法進行注入的。
那麼如果要在建構函式中使用這個值的話,就不能這樣來用了。

public XXXDao(@Value("${mongodb.host}") String mongoHost, @Value("${mongodb.port}") String mongoPort) {
    if (mongoClient == null) {
        mongoClient = new MongoClient(mongoHost, Integer.valueOf(mongoPort));
        db = mongoClient.getDatabase("xxx");
        collection = db.getCollection("xxx");
    }
}

如上,此時就應該在建構函式的引數上使用@Value進行注入了

相關推薦

Spring的@Value註解建構函式應用注意

在改造一個之前的SpringMVC專案,重新使用SpringBoot的架構。 有一個自定義屬性讀取的轉換過程,這裡記錄一下。 SpringMVC下的屬性讀取 專案使用MongoDB資料庫,直接使用MongoDB-Driver中的MongoClient進行程

在ServletContextListener 的實現類(使用Spring @Value 註解的方式讀取配置檔案、或者注入Spring bean)

在ServletContextListener 的實現類中 使用Spring @Value 註解的方式讀取配置檔案 我想向ServletContextListener中通過Spring @value 的方法讀取 properties 配置檔案資訊,但是我開始的方法不行 public class MyLi

Spring.net介紹及MVC應用

text name default 轉變 業務層 核心 解耦 inf star Spring.net兩大核心內容: IOC(控制反轉) 傳統的面相對象思維模式是對象A依賴對象B,對象B的實例化和調用都在對象A中發生,一旦對象B中發生變化,對象A也要隨之變化,這樣使得

kotlin spring @value 註解

spring boot和kotlin裡靜態類使用@Value註解配置解決方案前言spring boot裡預設是不能給靜態屬性使用@Value賦值的。所以這裡使用中間變數過渡繫結。 方案//applicaton.yml配置isDebug:truename:cy //Test類儲存配置資訊。使用@Value取

Springboot 類不能使用@Value註解從yml載入值

對於下面的類,使用了@Value,但是不能從yml中讀取值,怎麼辦? 帶有@Value標籤類: package com.itmuch.cloud; import org.springframework.beans.factory.annotation.Value; import org

Spring+MyBatis 在Junit測試需要注意的細節

    在Spring+MyBatis框架下Junit測試時如果直接@Autowired ServiceImpl service 的話會報錯:nullpointerexception; 需要在類上添加註解 @RunWith(SpringJUnit4Clas

Laravel 5.5 建構函式的session(判斷是否登入)

留給自己馬克一下   public function __construct() { $this->request = request(); // 驗證是否登入 $this->middleware(function ($request, $ne

c#建構函式的this和base

首先要明確: this指向的本例項的建構函式,base指向的時基類的建構函式。 再執行順序上,a、this表明,在執行本建構函式之前,先執行this指向本例項的建構函式,再執行本函式。          

C++建構函式呼叫虛擬函式是否有多型的效果

C++多型的一個重要應用就是虛擬函式。但是當我們再基類的建構函式中呼叫一個子類過載的虛擬函式會出現多型的效果嗎?我們具體看一下下面的例項: #include <iostream> #define P(x) std::cout<<x<<std::endl;

10.Spring-屬性注入-建構函式注入

ApplicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

在C#要自己手動在派生類的建構函式逐一的初始化基類的欄位嗎

public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String[

關於spring value註解取不到值問題。

關於spring在service層  @value註解取不到值問題。 解決方法: 在applicationContext..xml 還有 applicationContext-mvc.xml 來年改革檔案,都加入 <context:property-placeholder lo

27.能否在建構函式丟擲異常?解構函式呢?

首先,我們要明確一點!一個函式執行的過程中,如果丟擲異常,會導致函式提前終止! 在C++建構函式中,既需要分配記憶體,又需要丟擲異常時要特別注意防止記憶體洩露的情況發生。因為在建構函式中丟擲異常,在概念上將被視為該物件沒有被成功構造,因此當前物件的解構函式就不會被呼叫。同時

spring-data-redis 使用過程需要注意的一點(序列化選擇)

在專案中需要用到redis做快取,於是採用spring-data-redis,並且打算自己封裝一個redis的靜態工具類。後來在進行單元測試的過程中發現了一個容易出錯的地方,於是打算記錄下來,並分享給各位朋友。 這裡主要說下碰到的問題,首先,採用了spring-

spring部分註解說明(持續...)

[email protected]說明 被@PostConstruct修飾的方法會在伺服器載入Servlet的時候執行,並且只會被伺服器呼叫一次,類似於Serclet的inti()方法.被@PostConstruct修飾的方法會在建構函式之後,init()方法之前執行. [email&

JS建構函式有return的分析

目錄 寫在前面 demo幫助理解 寫在前面 簡單的總結來說就一句話:如果return的值是基本資料型別的話,則忽略return,直接返回例項化的物件;如果return的值是引用型別的話,則不再返回例項化的物件,而是直接返回return返回的引用型別的值。 demo幫助理解

C++ 拷貝建構函式淺拷貝與深拷貝

淺拷貝建構函式 看一段拷貝建構函式的程式碼 #include <iostream> #include <cstring> using namespace std; class Array{ public : Array()

嘗試解決在建構函式同步呼叫Dns.GetHostAddressesAsync()引起的執行緒死鎖

(最終採用的是方法4) 看看在 Linux 與 Windows 上發生執行緒死鎖的後果。 Linux: Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -24 EMFILE too many o

C++建構函式呼叫虛擬函式

談談關於建構函式中呼叫虛擬函式的情況,僅討論單繼承,不考慮虛擬繼承和多重繼承。 測試平臺:VS2013 + Win7X64 一個例子: #include <stdlib.h> #i

建構函式是否可以呼叫虛擬函式

1. 從語法上講,呼叫完全沒有問題。 2. 但是從效果上看,往往不能達到需要的目的。 Effective 的解釋是: 派生類物件構造期間進入基類的建構函式時,物件型別變成了基類型別,而不是派生類型別。 同樣,進入基類解構函式時,物件也是基類型別。 所以,虛擬函式始終僅僅呼叫