- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解五种方式让你在java中读取properties文件内容不再是难题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、背景 。
最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题。就借此机会把Spring+SpringMVC+Mybatis整合开发的项目中通过java程序读取properties文件内容的方式进行了梳理和分析,先和大家共享.
2、项目环境介绍 。
3、五种实现方式 。
方式1.通过context:property-placeholder加载配置文件jdbc.properties中的内容 。
1
|
<
context:property-placeholder
location
=
"classpath:jdbc.properties"
ignore-unresolvable
=
"true"
/>
|
上面的配置和下面配置等价,是对下面配置的简化 。
1
2
3
4
5
6
7
8
|
<
bean
id
=
"propertyConfigurer"
class
=
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
>
<
property
name
=
"ignoreUnresolvablePlaceholders"
value
=
"true"
/>
<
property
name
=
"locations"
>
<
list
>
<
value
>classpath:jdbc.properties</
value
>
</
list
>
</
property
>
</
bean
>
|
注意:这种方式下,如果你在spring-mvc.xml文件中有如下配置,则一定不能缺少下面的红色部分,关于它的作用以及原理. 。
1
2
3
4
|
<!-- 配置组件扫描,springmvc容器中只扫描Controller注解 -->
<
context:component-scan
base-package
=
"com.hafiz.www"
use-default-filters
=
"false"
>
<
context:include-filter
type
=
"annotation"
expression
=
"org.springframework.stereotype.Controller"
/>
</
context:component-scan
>
|
方式2.使用注解的方式注入,主要用在java代码中使用注解注入properties文件中相应的value值 。
1
2
3
4
5
6
7
8
|
<
bean
id
=
"prop"
class
=
"org.springframework.beans.factory.config.PropertiesFactoryBean"
>
<!-- 这里是PropertiesFactoryBean类,它也有个locations属性,也是接收一个数组,跟上面一样 -->
<
property
name
=
"locations"
>
<
array
>
<
value
>classpath:jdbc.properties</
value
>
</
array
>
</
property
>
</
bean
>
|
方式3.使用util:properties标签进行暴露properties文件中的内容 。
1
|
<
util:properties
id
=
"propertiesReader"
location
=
"classpath:jdbc.properties"
/>
|
注意:使用上面这行配置,需要在spring-dao.xml文件的头部声明以下红色的部分 。
1
2
3
4
5
6
7
8
9
10
|
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:context
=
"http://www.springframework.org/schema/context"
xmlns:util
=
"http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
|
方式4.通过PropertyPlaceholderConfigurer在加载上下文的时候暴露properties到自定义子类的属性中以供程序中使用 。
1
2
3
4
5
6
7
8
9
|
<
bean
id
=
"propertyConfigurer"
class
=
"com.hafiz.www.util.PropertyConfigurer"
>
<
property
name
=
"ignoreUnresolvablePlaceholders"
value
=
"true"
/>
<
property
name
=
"ignoreResourceNotFound"
value
=
"true"
/>
<
property
name
=
"locations"
>
<
list
>
<
value
>classpath:jdbc.properties</
value
>
</
list
>
</
property
>
</
bean
>
|
自定义类PropertyConfigurer的声明如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package
com.hafiz.www.util;
import
org.springframework.beans.BeansException;
import
org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import
java.util.Properties;
/**
* Desc:properties配置文件读取类
* Created by hafiz.zhang on 2016/9/14.
*/
public
class
PropertyConfigurer
extends
PropertyPlaceholderConfigurer {
private
Properties props;
// 存取properties配置文件key-value结果
@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);
}
}
|
使用方式:在需要使用的类中使用@Autowired注解注入即可.
方式5.自定义工具类PropertyUtil,并在该类的static静态代码块中读取properties文件内容保存在static属性中以供别的程序使用 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
package
com.hafiz.www.util;
import
org.slf4j.Logger;
import
org.slf4j.LoggerFactory;
import
java.io.*;
import
java.util.Properties;
/**
* Desc:properties文件获取工具类
* Created by hafiz.zhang on 2016/9/15.
*/
public
class
PropertyUtil {
private
static
final
Logger logger = LoggerFactory.getLogger(PropertyUtil.
class
);
private
static
Properties props;
static
{
loadProps();
}
synchronized
static
private
void
loadProps(){
logger.info(
"开始加载properties文件内容......."
);
props =
new
Properties();
InputStream in =
null
;
try
{
<!--第一种,通过类加载器进行获取properties文件流-->
in = PropertyUtil.
class
.getClassLoader().getResourceAsStream(
"jdbc.properties"
);
<!--第二种,通过类进行获取properties文件流-->
//in = PropertyUtil.class.getResourceAsStream("/jdbc.properties");
props.load(in);
}
catch
(FileNotFoundException e) {
logger.error(
"jdbc.properties文件未找到"
);
}
catch
(IOException e) {
logger.error(
"出现IOException"
);
}
finally
{
try
{
if
(
null
!= in) {
in.close();
}
}
catch
(IOException e) {
logger.error(
"jdbc.properties文件流关闭出现异常"
);
}
}
logger.info(
"加载properties文件内容完成..........."
);
logger.info(
"properties文件内容:"
+ props);
}
public
static
String getProperty(String key){
if
(
null
== props) {
loadProps();
}
return
props.getProperty(key);
}
public
static
String getProperty(String key, String defaultValue) {
if
(
null
== props) {
loadProps();
}
return
props.getProperty(key, defaultValue);
}
}
|
说明:这样的话,在该类被加载的时候,它就会自动读取指定位置的配置文件内容并保存到静态属性中,高效且方便,一次加载,可多次使用.
4、注意事项及建议 。
以上五种方式,前三种方式比较死板,而且如果你想在带有@Controller注解的Bean中使用,你需要在SpringMVC的配置文件spring-mvc.xml中进行声明,如果你想在带有@Service、@Respository等非@Controller注解的Bean中进行使用,你需要在Spring的配置文件中spring.xml中进行声明.
我个人比较建议第四种和第五种配置方式,第五种为最好,它连工具类对象都不需要注入,直接调用静态方法进行获取,而且只一次加载,效率也高。而且前三种方式都不是很灵活,需要修改@Value的键值.
5、测试验证是否可用 。
1.首先我们创建PropertiesService 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
package
com.hafiz.www.service;
/**
* Desc:java程序获取properties文件内容的service
* Created by hafiz.zhang on 2016/9/16.
*/
public
interface
PropertiesService {
/**
* 第一种实现方式获取properties文件中指定key的value
*
* @return
*/
String getProperyByFirstWay();
/**
* 第二种实现方式获取properties文件中指定key的value
*
* @return
*/
String getProperyBySecondWay();
/**
* 第三种实现方式获取properties文件中指定key的value
*
* @return
*/
String getProperyByThirdWay();
/**
* 第四种实现方式获取properties文件中指定key的value
*
* @param key
*
* @return
*/
String getProperyByFourthWay(String key);
/**
* 第四种实现方式获取properties文件中指定key的value
*
* @param key
*
* @param defaultValue
*
* @return
*/
String getProperyByFourthWay(String key, String defaultValue);
/**
* 第五种实现方式获取properties文件中指定key的value
*
* @param key
*
* @return
*/
String getProperyByFifthWay(String key);
/**
* 第五种实现方式获取properties文件中指定key的value
*
* @param key
*
* @param defaultValue
*
* @return
*/
String getProperyByFifthWay(String key, String defaultValue);
}
|
2.创建实现类PropertiesServiceImpl 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
package
com.hafiz.www.service.impl;
import
com.hafiz.www.service.PropertiesService;
import
com.hafiz.www.util.PropertyConfigurer;
import
com.hafiz.www.util.PropertyUtil;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.beans.factory.annotation.Value;
import
org.springframework.stereotype.Service;
/**
* Desc:java程序获取properties文件内容的service的实现类
* Created by hafiz.zhang on 2016/9/16.
*/
@Service
public
class
PropertiesServiceImpl
implements
PropertiesService {
@Value
(
"${test}"
)
private
String testDataByFirst;
@Value
(
"#{prop.test}"
)
private
String testDataBySecond;
@Value
(
"#{propertiesReader[test]}"
)
private
String testDataByThird;
@Autowired
private
PropertyConfigurer pc;
@Override
public
String getProperyByFirstWay() {
return
testDataByFirst;
}
@Override
public
String getProperyBySecondWay() {
return
testDataBySecond;
}
@Override
public
String getProperyByThirdWay() {
return
testDataByThird;
}
@Override
public
String getProperyByFourthWay(String key) {
return
pc.getProperty(key);
}
@Override
public
String getProperyByFourthWay(String key, String defaultValue) {
return
pc.getProperty(key, defaultValue);
}
@Override
public
String getProperyByFifthWay(String key) {
return
PropertyUtil.getPropery(key);
}
@Override
public
String getProperyByFifthWay(String key, String defaultValue) {
return
PropertyUtil.getProperty(key, defaultValue);
}
}
|
3.控制器类PropertyController 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
package
com.hafiz.www.controller;
import
com.hafiz.www.service.PropertiesService;
import
com.hafiz.www.util.PropertyUtil;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Controller;
import
org.springframework.web.bind.annotation.PathVariable;
import
org.springframework.web.bind.annotation.RequestMapping;
import
org.springframework.web.bind.annotation.RequestMethod;
import
org.springframework.web.bind.annotation.ResponseBody;
/**
* Desc:properties测试控制器
* Created by hafiz.zhang on 2016/9/16.
*/
@Controller
@RequestMapping
(
"/prop"
)
public
class
PropertyController {
@Autowired
private
PropertiesService ps;
@RequestMapping
(value =
"/way/first"
, method = RequestMethod.GET)
@ResponseBody
public
String getPropertyByFirstWay(){
return
ps.getProperyByFirstWay();
}
@RequestMapping
(value =
"/way/second"
, method = RequestMethod.GET)
@ResponseBody
public
String getPropertyBySecondWay(){
return
ps.getProperyBySecondWay();
}
@RequestMapping
(value =
"/way/third"
, method = RequestMethod.GET)
@ResponseBody
public
String getPropertyByThirdWay(){
return
ps.getProperyByThirdWay();
}
@RequestMapping
(value =
"/way/fourth/{key}"
, method = RequestMethod.GET)
@ResponseBody
public
String getPropertyByFourthWay(
@PathVariable
(
"key"
) String key){
return
ps.getProperyByFourthWay(key,
"defaultValue"
);
}
@RequestMapping
(value =
"/way/fifth/{key}"
, method = RequestMethod.GET)
@ResponseBody
public
String getPropertyByFifthWay(
@PathVariable
(
"key"
) String key){
return
PropertyUtil.getProperty(key,
"defaultValue"
);
}
}
|
4.jdbc.properties文件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.1.196:3306/dev?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
jdbc.maxActive=200
jdbc.minIdle=5
jdbc.initialSize=1
jdbc.maxWait=60000
jdbc.timeBetweenEvictionRunsMillis=60000
jdbc.minEvictableIdleTimeMillis=300000
jdbc.validationQuery=select 1 from t_user
jdbc.testWhileIdle=true
jdbc.testOnReturn=false
jdbc.poolPreparedStatements=true
jdbc.maxPoolPreparedStatementPerConnectionSize=20
jdbc.filters=stat
#test data
test=com.hafiz.www
|
5.项目结果图 。
6.项目下载:demo propertiesConfigurer.zip 。
7.测试结果 。
第一种方式 。
第二种方式 。
第三种方式 。
第四种方式 。
第五种方式 。
6、总结 。
通过本次的梳理和测试,我们理解了Spring和SpringMVC的父子容器关系以及context:component-scan标签包扫描时最容易忽略的use-default-filters属性的作用以及原理。能够更好地定位和快速解决再遇到的问题。总之,棒棒哒~~~ 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.cnblogs.com/hafiz/p/5876243.html 。
最后此篇关于详解五种方式让你在java中读取properties文件内容不再是难题的文章就讲到这里了,如果你想了解更多关于详解五种方式让你在java中读取properties文件内容不再是难题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我一直在阅读有关汇编函数的内容,但对于是使用进入和退出还是仅使用调用/返回指令来快速执行,我感到很困惑。一种方式快而另一种方式更小吗?例如,在不内联函数的情况下,在汇编中执行此操作的最快(stdcal
我正在处理一个元组列表,如下所示: res = [('stori', 'JJ'), ('man', 'NN'), ('unnatur', 'JJ'), ('feel', 'NN'), ('pig',
最近我一直在做很多网络或 IO 绑定(bind)操作,使用线程有助于加快代码速度。我注意到我一直在一遍又一遍地编写这样的代码: threads = [] for machine, user, data
假设我有一个名为 user_stats 的资源,其中包含用户拥有的帖子、评论、喜欢和关注者的数量。是否有一种 RESTful 方式只询问该统计数据的一部分(即,对于 user_stats/3,请告诉我
我有一个简单的 api,它的工作原理是这样的: 用户创建一个请求 ( POST /requests ) 另一个用户检索所有请求 ( GET /requests ) 然后向请求添加报价 ( POST /
考虑以下 CDK Python 中的示例(对于这个问题,不需要 AWS 知识,这应该对基本上任何构建器模式都有效,我只是在这个示例中使用 CDK,因为我使用这个库遇到了这个问题。): from aws
Scala 中管理对象池的首选方法是什么? 我需要单线程创建和删除大规模对象(不需要同步)。在 C++ 中,我使用了静态对象数组。 在 Scala 中处理它的惯用和有效方法是什么? 最佳答案 我会把它
我有一个带有一些内置方法的类。这是该类的抽象示例: class Foo: def __init__(self): self.a = 0 self.b = 0
返回和检查方法执行的 Pythonic 方式 我目前在 python 代码中使用 golang 编码风格,决定移动 pythonic 方式 例子: import sys from typing imp
我正在开发一个 RESTful API。其中一个 URL 允许调用者通过 id 请求特定人员的记录。 返回该 id 不存在的记录的常规值是什么?服务器是否应该发回一个空对象或者一个 404,或者其他什
我正在使用 pathlib.Path() 检查文件是否存在,并使用 rasterio 将其作为图像打开. filename = pathlib.Path("./my_file-name.tif") 但
我正在寻找一种 Pythonic 方式来从列表和字典创建嵌套字典。以下两个语句产生相同的结果: a = [3, 4] b = {'a': 1, 'b': 2} c = dict(zip(b, a))
我有一个正在操裁剪理设备的脚本。设备有时会发生物理故障,当它发生时,我想重置设备并继续执行脚本。我有这个: while True: do_device_control() device
做组合别名的最pythonic和正确的方法是什么? 这是一个假设的场景: class House: def cleanup(self, arg1, arg2, kwarg1=False):
我正在开发一个小型客户端服务器程序来收集订单。我想以“REST(ful)方式”来做到这一点。 我想做的是: 收集所有订单行(产品和数量)并将完整订单发送到服务器 目前我看到有两种选择: 将每个订单行发
我知道在 Groovy 中您可以使用字符串调用类/对象上的方法。例如: Foo."get"(1) /* or */ String meth = "get" Foo."$meth"(1) 有没有办法
在 ECMAScript6 中,您可以使用扩展运算符来解构这样的对象 const {a, ...rest} = obj; 它将 obj 浅拷贝到 rest,不带属性 a。 有没有一种干净的方法可以在
我有几个函数返回数字或None。我希望我的包装函数返回第一个不是 None 的结果。除了下面的方法之外,还有其他方法吗? def func1(): return None def func2(
假设我想设计一个 REST api 来讨论歌曲、专辑和艺术家(实际上我就是这样做的,就像我之前的 1312414 个人一样)。 歌曲资源始终与其所属专辑相关联。相反,专辑资源与其包含的所有歌曲相关联。
这是我认为必须经常出现的问题,但我一直无法找到一个好的解决方案。假设我有一个函数,它可以作为参数传递一个开放资源(如文件或数据库连接对象),或者需要自己创建一个。如果函数需要自己打开文件,最佳实践通常
我是一名优秀的程序员,十分优秀!