Spring框架讀取property屬性文件常用5種方法
1、方式一:通過(guò)spring框架 PropertyPlaceholderConfigurer 工具實(shí)現(xiàn)
<bean id="propertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreUnresolvablePlaceholders" value="true"/> <property name="locations"> <value>classpath:conf/jdbc.properties</value> </property> <property name="fileEncoding"> <value>UTF-8</value> </property> <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> </bean> <!-- 數(shù)據(jù)源配置 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${database.connection.driver}"/> <property name="url" value="${database.connection.url}"/> <property name="username" value="${database.connection.username}"/> <property name="password" value="${database.connection.password}"/> </bean> <!-- DAL客戶端接口實(shí)現(xiàn)-> <bean id="dalClient" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean>
2、方式二:簡(jiǎn)化配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "> <context:property-placeholder location="classpath:conf/jdbc.properties" ignore-unresolvable="true"/> <!-- 數(shù)據(jù)源配置 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${database.connection.driver}"/> <property name="url" value="${database.connection.url}"/> <property name="username" value="${database.connection.username}"/> <property name="password" value="${database.connection.password}"/> </bean> <!-- DAL客戶端接口實(shí)現(xiàn)--> <bean id="dalClient" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <!--備注:如果${} 這種寫(xiě)法無(wú)法讀取到,或者編譯出錯(cuò),則增加ignore-unresolvable="true"的屬性信息,并添加上文的 命名空間信息--> jdbc.properties文件: database.connection.driver=com.mysql.jdbc.Driver database.connection.url=jdbc:mysql://*.*.*.*:3306/mysql?characterEncoding=utf-8 database.connection.username=* database.connection.password=*
上述配置理解:
1)ignore-unresolvable屬性的示意:
<xsd:documentation><![CDATA[
Specifies if failure to find the property value to replace a key should be ignored.
Default is "false", meaning that this placeholder configurer will raise an exception
if it cannot resolve a key. Set to "true" to allow the configurer to pass on the key
to any others in the context that have not yet visited the key in question.
]]>
翻譯后:指定是否應(yīng)忽略未能找到用于替換鍵的屬性值。默認(rèn)值為“false”,表示如果它無(wú)法解析密鑰,此占位符配置程序?qū)⒁l(fā)異常。設(shè)置為“true”以允許配置程序傳遞密鑰對(duì)于上下文中尚未訪問(wèn)相關(guān)密鑰的任何其他用戶。
2) 為簡(jiǎn)化 PropertyPlaceholderConfigurer 的使用,Spring提供了<context:property-placeholder location="classpath:jdbc.properties" />元素,啟用它后,開(kāi)發(fā)者便不用配置PropertyPlaceholderConfigurer對(duì)象了。
PropertyPlaceholderConfigurer內(nèi)置的功能非常豐富,如果它未找到${xxx}中定義的xxx鍵,它還會(huì)去JVM系統(tǒng)屬性(System.getProperty())和環(huán)境變量(System.getenv())中尋找。其通過(guò)啟用systemPropertiesMode和searchSystemEnvironment屬性,開(kāi)發(fā)者能夠控制這一行為。context:property-placeholder大大的方便了我們數(shù)據(jù)庫(kù)的配置。這樣就可以為spring配置的bean的屬性設(shè)置值了。
備注:spring容器中最多只能定義一個(gè) context:property-placeholder,否則會(huì)報(bào)錯(cuò):Could not resolve placeholder XXX,但如果想引入多個(gè)屬性文件怎么辦那,可以使用通配符:<context:property-placeholder location="classpath*:conf*.properties"/>
3、方式三:通過(guò)對(duì)spring PropertyPlaceholderConfigurer bean工廠后置處理器的實(shí)現(xiàn),在java程序中進(jìn)行屬性文件的讀取
<bean id="propertyConfigurer" class="com.weblearn.utils.PropertyConfigurer"> <property name="locations"> <list> <value>classpath:conf/web-sys-relation.properties</value> <value>classpath:conf/jdbc.properties</value> <value>classpath:conf/main-setting-web.properties</value> </list> </property> <property name="fileEncoding" value="UTF-8"/> </bean> <!-- DAL客戶端接口實(shí)現(xiàn)--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${database.connection.driver}"/> <property name="url" value="${database.connection.url}"/> <property name="username" value="${database.connection.username}"/> <property name="password" value="${database.connection.password}"/> </bean> <bean id="dalClient" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean>
public class PropertyConfigurer extends PropertyPlaceholderConfigurer { /* PropertyPlaceholderConfigurer 是個(gè)bean工廠后置處理器的實(shí)現(xiàn),也就是 BeanFactoryPostProcessor 接口的一個(gè)實(shí)現(xiàn)。 在Spring中,使用PropertyPlaceholderConfigurer可以在XML配置文件中加入外部屬性文件,當(dāng)然也可以指定外部文件的編碼。PropertyPlaceholderConfigurer可以將上下文 (配置文 件)中的屬性值放在另一個(gè)單獨(dú)的標(biāo)準(zhǔn)java Properties文件中去。在XML文件中用${key}替換指定的properties文件中的值。這樣的話,只需要對(duì)properties文件進(jìn) 行修改,而不用對(duì)xml配置文件進(jìn)行修改。 引入外部文件后,就可以在xml中用${key}替換指定的properties文件中的值,通常項(xiàng)目中都會(huì)將jdbc的配置放在properties文件中。 在啟動(dòng)容器時(shí),初始化bean時(shí),${key}就會(huì)替換成properties文件中的值。 */ //存取properties配置文件key-value結(jié)果 private Properties props; @Override protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException { super.processProperties(beanFactoryToProcess, props); this.props = props; } public String getProperty(String key) { return this.props.getProperty(key); } public String getProperty(String key, String defaultValue) { return this.props.getProperty(key, defaultValue); } public Object setProperty(String key, String value) { return this.props.setProperty(key, value); } } @Controller @RequestMapping("/") public class TestController { @Autowired PropertyConfigurer propertyConfigurer; @RequestMapping("/index.do") public String getIndex(HttpServletRequest request, HttpServletResponse response, Model model) { Map map = new HashMap<String, Object>(); map.put("orderNo", "111"); String address1 = propertyConfigurer.getProperty("static.picture.address1"); String resRoot = propertyConfigurer.getProperty("resRoot"); String envName = propertyConfigurer.getProperty("database.connection.username"); String keyzjbceshi = propertyConfigurer.getProperty("keyceshi"); map.put("address1", address1); map.put("resRoot", resRoot); map.put("envName", envName); map.put("keyzjbceshi", keyzjbceshi); model.addAllAttributes(map); return "index/index.ftl"; } }
4、方式四:通過(guò)ClassPathResource類進(jìn)行屬性文件的讀取使用
public class ReadPropertiesUtils1 { private static final Logger LOGGER = LoggerFactory.getLogger(ReadPropertiesUtils1.class); private static Properties props = new Properties(); static { ClassPathResource cpr = new ClassPathResource("conf/ref-system-relation.properties");// 會(huì)重新加載spring框架 try { props.load(cpr.getInputStream()); } catch (IOException exception) { LOGGER.error("ReadPropertiesUtils1 IOException", exception); } } private ReadPropertiesUtils1() { } public static String getValue(String key) { return (String) props.get(key); } public static void main(String[] args) { System.out.println("static.picture.address1>>>"+ ReadPropertiesUtils1.getValue("static.picture.address1")); System.out.println("static.picture.address2>>>"+ ReadPropertiesUtils1.getValue("static.picture.address2")); } }
5、方式五:通過(guò)ContextClassLoader進(jìn)行屬性文件的讀取使用
public class ReadPropertiesUtils2 { private static final Logger LOGGER = LoggerFactory.getLogger(ReadPropertiesUtils2.class); public static String getValue(String key) { Properties properties = new Properties(); try { InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("conf/ref-system-relation.properties"); properties.load(inputStream); } catch (FileNotFoundException e) { LOGGER.error("conf/web-sys-relation.properties文件沒(méi)有找到異常", e); } catch (IOException e) { LOGGER.error("IOException", e); } return properties.getProperty(key); } public static void main(String[] args) { System.out.println("static.picture.address1>>>" + ReadPropertiesUtils2.getValue("static.picture.address1")); System.out.println("static.picture.address2>>>" + ReadPropertiesUtils2.getValue("static.picture.address2")); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring如何使用PropertyPlaceholderConfigurer讀取文件
- Spring Boot中@ConditionalOnProperty的使用方法
- Spring @value和@PropertySource注解使用方法解析
- Spring Boot自定義配置屬性源(PropertySource)
- Spring中property-placeholder的使用與解析詳解
- Spring boot中PropertySource注解的使用方法詳解
- spring boot 注入 property的三種方式(推薦)
- 詳解Spring Boot 自定義PropertySourceLoader
- spring-core組件詳解——PropertyResolver屬性解決器
相關(guān)文章
解決Java調(diào)用BAT批處理不彈出cmd窗口的方法分析
本篇文章是對(duì)Java調(diào)用BAT批處理不彈出cmd窗口的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05詳解使用spring cloud config來(lái)統(tǒng)一管理配置文件
這篇文章主要介紹了詳解使用spring cloud config來(lái)統(tǒng)一管理配置文件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12使用Netty解決TCP粘包和拆包問(wèn)題過(guò)程詳解
這篇文章主要介紹了使用Netty解決TCP粘包和拆包問(wèn)題過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07java:程序包c(diǎn)om.xxx.xxx不存在報(bào)錯(cuò)萬(wàn)能解決辦法
這篇文章主要給大家介紹了關(guān)于java:程序包c(diǎn)om.xxx.xxx不存在報(bào)錯(cuò)萬(wàn)能解決辦法,這個(gè)問(wèn)題曾逼瘋初學(xué)者的我,不過(guò)弄清楚原理后就很簡(jiǎn)單了,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12詳解java中通過(guò)post方式訪問(wèn)后臺(tái)服務(wù)器
本篇文章主要介紹了詳解java中通過(guò)post方式訪問(wèn)后臺(tái)服務(wù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03IDEA創(chuàng)建Java?Web項(xiàng)目的超詳細(xì)圖文教學(xué)
IDEA是程序員們常用的java集成開(kāi)發(fā)環(huán)境,也是被公認(rèn)為最好用的java開(kāi)發(fā)工具,下面這篇文章主要給大家介紹了關(guān)于IDEA創(chuàng)建Java?Web項(xiàng)目的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12Spring MVC學(xué)習(xí)教程之RequestMappingHandlerMapping匹配
這篇文章主要給大家介紹了關(guān)于Spring MVC學(xué)習(xí)教程之RequestMappingHandlerMapping匹配的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11