Spring 3.1 –從數據庫加載XML配置的屬性

Spring使通過其PropertyPlaceholderConfigurer和(Spring 3.1之前)PropertySourcesPlaceholderConfigurer(Spring 3.1)從屬性文件中獲取的值易于注入。 這些類實現了BeanFactoryPostProcessor接口,該接口使它們能夠在初始化bean之前在Spring XML配置文件中操作值。 因此,如果您指定將$ {jdbc.driverClassName}設置為屬性“ driverClassName”,則該變量將被替換/交換為屬性文件中帶有鍵“ jdbc.driverClassName”的值。

除了屬性文件之外,數據庫表還可以是獲取鍵值對的地方。 太好了,所以只需擴展PropertySourcesPlaceholderConfigurer,并讓它讀取包含鍵值對的表,然后填充它們就可以了!

但是,有一個小問題。 如果DataSource bean也依賴于從屬性文件獲得的值(例如JDBC URL,用戶名,密碼)并且是出色的Springer,請將此bean注入擴展PropertySourcesPlaceholderConfigurer的bean類中,則bean容器將無法正確啟動,因為' jdbc.driverClassName'變量無法解析。 奇怪,但事實如此。

這樣做的原因是,任何注入到BeanFactoryPostProcessor類中的bean都會在BeanFactoryPostProcessor類運行之前觸發Bean初始化。 您知道,依賴注入…所有依賴的bean必須先準備好才能注入到使用者中。 因此,這創建了一種循環依賴的東西。 在運行BeanFactoryPostProcessor類之前,首先要解析XML配置中的所有依賴關系。

那么,如何處理呢? 好吧,您可以使用一個技巧。 BeanFactoryPostProcessor類可以通過“ postProcessBeanFactory”方法訪問ConfigurableListableBeanFactory對象。 從該對象,您可以執行“ getBean”并獲取具有ID的任何bean的引用。 猜猜是什么,您可以獲取吹噓的DataSource bean,而無需觸發過早的bean初始化。

假設有一個包含以下數據的表“ sys_param”:

PARAM_CD PARAM_VALUE
-------------- --------------
service.charge 1.5
rebate.amount 15.99
smtp.ip 173.194.79.16

DbPropertySourcesPlaceholderConfigurer如下所示:

package org.gizmo.labs.utils.spring;import javax.sql.DataSource;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;public class DbPropertySourcesPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer
{@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException{DataSource dataSource = beanFactory.getBean(DataSource.class);DbProperties dbProps = new DbProperties(dataSource);setProperties(dbProps);super.postProcessBeanFactory(beanFactory);}
}

DbProperties類將使用DataSource引用并查詢數據庫以獲取鍵值對:

package org.gizmo.labs.utils.spring;import java.util.List;
import java.util.Map;
import java.util.Properties;import javax.sql.DataSource;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;public class DbProperties extends Properties
{private final Logger logger = LoggerFactory.getLogger(DbProperties.class);private static final long serialVersionUID = 1L;public DbProperties(DataSource dataSource){super();JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); List<map> l = jdbcTemplate.queryForList('select param_cd, param_value from sys_param');for(Mapm: l){logger.debug('Loading from DB: [{}:{}]', m.get('PARAM_CD'), m.get('PARAM_VALUE'));setProperty((m.get('PARAM_CD')).toString(), (m.get('PARAM_VALUE')).toString());}}
}

為了證明表中的值已正確注入,下面是充當使用者的類:

package org.gizmo.labs.utils.spring;import java.math.BigDecimal;import org.apache.commons.lang.builder.ReflectionToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;public class DbPropConsumer implements InitializingBean
{private final Logger logger = LoggerFactory.getLogger(DbPropConsumer.class);private BigDecimal serviceCharge;private double rebateAmount;private String smtpIp;@Overridepublic void afterPropertiesSet() throws Exception{logger.debug('I have consumed: {}', this);}public String toString(){return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE);}	public BigDecimal getServiceCharge() {return serviceCharge;}public void setServiceCharge(BigDecimal serviceCharge) {this.serviceCharge = serviceCharge;}public double getRebateAmount() {return rebateAmount;}public void setRebateAmount(double rebateAmount) {this.rebateAmount = rebateAmount;}public String getSmtpIp() {return smtpIp;}public void setSmtpIp(String smtpIp) {this.smtpIp = smtpIp;}}

最后但并非最不重要的一點是,Spring配置(未顯示DataSource bean,為清楚起見進行了簡化):

classpath:system.properties

前兩個bean定義是BeanFactoryPostProcessor類,并且為了確保第一個被首先運行,設置了'order'屬性(值越低優先級越高)。

對于DbPropertySourcesPlaceholderConfigurer,為了清楚起見,使用了不同的占位符前綴和后綴(請注意DbPropConsumer的占位符)。

因此,在Spring容器啟動時,您應該能夠查看類似的輸出,如下所示:

2012-09-18 00:03:14, DEBUG, org.gizmo.labs.utils.spring.DbProperties, Loading from DB: [service.charge:1.5]
2012-09-18 00:03:14, DEBUG, org.gizmo.labs.utils.spring.DbProperties, Loading from DB: [rebate.amount:15.99]
2012-09-18 00:03:14, DEBUG, org.gizmo.labs.utils.spring.DbProperties, Loading from DB: [smtp.ip:173.194.79.16]
2012-09-18 00:03:14, DEBUG, org.gizmo.labs.utils.spring.DbPropConsumer, I have consumed: org.gizmo.labs.utils.spring.DbPropConsumer@189b939[
logger=Logger[org.gizmo.labs.utils.spring.DbPropConsumer]
serviceCharge=1.5
rebateAmount=15.99
smtpIp=173.194.79.16
]

參考: Spring 3.1 – YK的Workshop博客中的JCG合作伙伴 Allen Julia 從數據庫加載XML配置的屬性 。

翻譯自: https://www.javacodegeeks.com/2012/11/spring-3-1-loading-properties-for-xml-configuration-from-database.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370653.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370653.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370653.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何判斷PHP 是線程安全還是非線程安全的

什么是線程安全與非線程安全&#xff1f; 線程安全就是在多線程環境下也不會出現數據不一致&#xff0c;而非線程安全就有可能出現數據不一致的情況。 線程安全由于要確保數據的一致性&#xff0c;所以對資源的讀寫進行了控制&#xff0c;換句話說增加了系統開銷。所以在單線程…

關聯查詢mysql_《MySQL數據庫》關聯查詢

原標題&#xff1a;《MySQL數據庫》關聯查詢一、關聯查詢1、概念在查詢數據時&#xff0c;所需要的數據不只在一張表中&#xff0c;可能在兩張或多張表中。這個時候&#xff0c;需要同時操作這些表來查詢數據&#xff0c;即關聯查詢。關聯查詢所涉及到的表與表之間都會存在有關…

python語言語塊句的標記_《自然語言處理理論與實戰》

編輯推薦 1.講解自然語言處理的理論 2.案例豐富&#xff0c;實戰性強 3.適合自然語言處理學習的入門者 內容提要 自然語言處理是什么&#xff1f;誰需要學習自然語言處理&#xff1f;自然語言處理在哪些地方應用&#xff1f;相關問題一直困擾著不少初學者。針對這一情況&#x…

NOIP2017年11月9日賽前模擬

最后一次NOIP模擬了 題目1&#xff1a;回文數字 Tom 最近在研究回文數字。  假設 s[i] 是長度為 i 的回文數個數&#xff08;不含前導0&#xff09;&#xff0c;則對于給定的正整數 n 有&#xff1a; 以上等式中最后面的括號是布爾表達式&#xff0c;Tom 想知道S[n] mod 2333…

height百分比失效

heigh:100%失效 解決方案&#xff1a; 第一種 html, body { height: 100%; } 第二種 div { height: 100%; position: absolute; } 非定位元素的寬高百分比計算不會將 padding 計算在內&#xff0c;而定位元素會計算在內。 利用這個特性可以實現圖片左右半區點擊分別上一張圖…

Java堆空間,本機堆和內存問題

最近&#xff0c;我在和一個朋友討論為什么Java進程使用的內存比啟動Java進程時設置的最大堆多。 代碼創建的所有Java對象都是在Java堆空間內創建的&#xff0c;其大小由-Xmx選項定義。 但是一個Java進程由很多空間組成&#xff0c;而不僅僅是Java堆空間。 以下是組成Java進程…

mysql視圖表怎么設置約束_MySQL一一sql的視圖、索引、約束

一、視圖本質上相當于一張**“虛擬表”**&#xff0c;可當作獨立的一張表進行操作(增、刪、改、查)** 作用&#xff1a;**** a)**可通過權限控制&#xff0c;只將“表中的少數列”暴露給數據庫用戶&#xff0c;而不讓該用戶直接操縱數據庫中“實際表”** b)**…

Software Development Life Cycle

轉載于:https://www.cnblogs.com/genezhao/p/6879848.html

python中 的用法_詳解python中@的用法

python中的用法 是一個裝飾器&#xff0c;針對函數&#xff0c;起調用傳參的作用。 有修飾和被修飾的區別&#xff0c;function作為一個裝飾器&#xff0c;用來修飾緊跟著的函數&#xff08;可以是另一個裝飾器&#xff0c;也可以是函數定義&#xff09;。 代碼1 結果1 Its fun…

ArrayAndString(數組和字符串)

1.實現一個算法&#xff0c;確定一個字符串的所有字符是否全都不同。假使不允許使用額外的數據結構&#xff0c;又該怎么處理&#xff1f; public class UniqueChars {public static void main(String[] args) {// TODO Auto-generated method stubString string "abcdef…

MyBatis教程– CRUD操作和映射關系–第2部分

為了說明這一點&#xff0c;我們正在考慮以下示例域模型&#xff1a; 會有用戶&#xff0c;每個用戶可能都有一個博客&#xff0c;每個博客可以包含零個或多個帖子。 這三個表的數據庫結構如下&#xff1a; CREATE TABLE user (user_id int(10) unsigned NOT NULL auto_incr…

position 的屬性值

理論上來說&#xff0c;全部 position 的取值有8個 包括&#xff1a;position&#xff1a;static | relative | absolute | fixed | sticky | initial | inherit | unset 其中最常用的是 static 、relative、absolute、fixed 和 sticky initial、inherit、unset 是css的關鍵…

[ JavaScript ] JavaScript 實現繼承.

對于javascript中的繼承&#xff0c;因為js中沒有后端語言中的類式繼承。所以js中的繼承&#xff0c;一般都是原型繼承(prototype)。 function P (name){this.name name;this.say function(){console.log(p);} }function S (name,id){this.id id;this.eat function(){conso…

mysql數據庫應用的權限層級_MySQL數據庫的用戶權限管理

嗨&#xff01;各位小伙伴今天翻了一下歷史記錄MySQL 數據庫還有點內容今天開始我們就來補上吧~用戶權限管理伙伴們要知道&#xff0c;在數據庫方面有兩個方向。一個是數據庫管理員(Database Administrator)簡稱DBA&#xff0c;一個是數據庫開發工程師(Database Developer)&…

linux i2c adapter 增加設備_Linux驅動之I2C驅動架構

一、Linux的I2C體系結構主要由三部分組成&#xff1a;(1) I2C核心提供I2C控制器和設備驅動的注冊和注銷方法&#xff0c;I2C通信方法&#xff0c;與適配器無關的代碼以及探測設備等。(2) I2C控制器驅動(適配器)(3) I2C設備驅動二、重要的結構體i2c_adapter//i2c控制器(適配器)i…

Alpha-end

前言 失心瘋病源10團隊代碼管理github個人感悟 肝不動了&#xff0c;肝不動了。明天如果見不到我&#xff0c;不要太想我。站立會議 隊名&#xff1a;PMS530雨勤&#xff08;組長&#xff09; 今天完成了那些任務 熬夜肝代碼代碼簽入github明天的計劃 肝到凌晨還剩下哪些任務 團…

html 01前沿-web介紹

1. 認識網頁 網頁主要由文字、圖像和超鏈接等元素構成。當然&#xff0c;除了這些元素&#xff0c;網頁中還可以包含音頻、視頻以及Flash等。 2. 瀏覽器&#xff08;顯示代碼&#xff09; 瀏覽器是網頁顯示、運行的平臺&#xff0c;常用的瀏覽器有IE、火狐&#xff08;Firefox…

避免寫慢SQL

最近在整理數據庫中的慢SQL&#xff0c;同時也查詢了相關資料。記錄一下&#xff0c;要學會使用執行計劃來分析SQL。 1. 為查詢緩存優化你的查詢 大多數的MySQL服務器都開啟了查詢緩存。這是提高性最有效的方法之一&#xff0c;而且這是被MySQL的數據庫引擎處理的。當有很多相同…

為什么子孫后代會討厭使用java.util.Stack

在我用無意義的重言式殺死你之前&#xff0c;這是要點 如果您的應用程序接近實時&#xff0c;或者將代碼發送到Mars&#xff0c;則需要保留Java中默認的Stack實現。 根據LinkedList編寫您自己的版本。 同樣&#xff0c;如果您的應用程序是關鍵任務&#xff0c;并且希望堆棧由…

play 連接mysql_Play framework 2.x 連接mysql | 學步園

筆者所使用的系統為64位 windows7。本文假設java1.5版本以上環境已經搭好&#xff0c;play 框架已經下載至本地。首先我們創建一個項目。命令行進入play的目錄命令&#xff1a;play new demo再次輸入項目名字輸入2 選擇java項目創建完成界面OK&#xff0c;一個play框架下的java…