- 浏览: 9378 次
- 性别:
- 来自: 杭州
最新评论
本文属性文件的读取主要针对于传统spring框架的项目。
主要介绍以下三种方式:
方式一、在 xml 标签中指定属性文件位置
config.properties 文件位于 src/main/resources 下,其内容如下:
配置数据源:
测试类:
输出结果为:
方式一的另一种写法:不使用标签,而是使用spring提供的PropertyPlaceholderConfigurer。
如下:
方式二、使用注解方式读取属性文件的值
在使用注解前,首先要告诉spring属性文件的位置:
随意定义一个被spring管理的bean:
测试:
输出:
方式二有另一种写法,不过稍有不同:使用${}取值可以取得属性文件中带“.”号的键所对应的值,如“jdbc.username=mysql",而使用#{}取值时,若键中带有“.”号,则会提示异常。
该写法如下:
(先将config.properties中的jdbc.username改为username)
如果必须要用#{}取值方式获取带有“.”键的值(基本上不会有这种要求),可以通过#{'${}'}嵌套使用,如
方式三、通过Properties类和IO流,将属性文件读取到键值对的容器中,使用时直接通过键获取
1. 为了让属性文件的路径可配置,可将文件路径字符串作为一个bean,通过spring获取:
注意:使用tomcat容器启动时,相对路径为tomcat下的bin目录; 直接调用JVM而非使用WEB容器启动时(单元测试就是其中一种),相对路径为项目目录。
2. 获取 spring 中的 bean "configPath",使用IO流创建 Properties类.
其中的 AppContext 类在 配置文件中定义,其类内容如下:
测试:
创建一个随项目启动即创建的 Servlet,或者 创建一个 Listener,在初始化的方法中测试效果(以Listener为例):
输出结果:
总结
方式一读取配置文件非常适合在 spring 配置文件中获取指定位置的属性文件内容;
方式二基本属于打酱油;
方式三非常适合在具体代码中获取指定位置属性文件内容,如 ip,端口,ftp 地址等。
方式一和方式二的内容是在公司无法粘贴代码环境下写的,词语拼写很可能出错,请自行分辨!(也因此没有代码文件,如有需要,后期补充)
方式三代码地址: https://github.com/Getthrough/loadConfigFile
主要介绍以下三种方式:
[1] 通过 spring 支持的 xml 标签,加载属性文件;
[2] 通过 spring 注解获取属性值;
[3] 通过字节流读取,按规则存储在容器类中。
方式一、在 xml 标签中指定属性文件位置
<!-- 可以通过 * 通配符方式加载多个属性文件 --> <context:property-placeholder location="classpath:config.properties"/>
config.properties 文件位于 src/main/resources 下,其内容如下:
#jdbc config jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/demo jdbc.username=mysql jdbc.password=password
配置数据源:
<bean id = "dataSource" class = "org.springframework.jdbc.dataSource.DriverManagerDataSource"> <!-- 使用 ${} 进行取值,它属于 SpEL 表达式 --> <property name = "driverClassName" value = "${jdbc.driver}"/> <property name = "url" value = "${jdbc.url}"/> <property name = "username" value = "${jdbc.username}"/> <property name = "password" value = "${jdbc.password}"/> </bean>
测试类:
// import ... /** * 通过 xml 标签方式加载属性文件测试类 */ public class TagLoadTest { @Test public void configReadTest() { // root-context.xml是spring的根配置文件,与config.properties同级目录 ApplicationContext context = new ClassPathXmlApplicationContext("root-context.xml"); DriverManagerDataSource dataSource = (DriverManagerDataSource) context.getBean("dataSource"); System.out.printf("dataSource username is %s \n", dataSource.getUsername()"); } }
输出结果为:
dataSource username is mysql // 成功读取到 username 对应的值为 mysql
方式一的另一种写法:不使用标签,而是使用spring提供的PropertyPlaceholderConfigurer。
如下:
<bean id = "propertyConfigurer" class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name = "location" value = "config.properties"/> <!-- 加载多个文件,使用name = "locations" --> <!-- <property name = "locations"> <array> <value>config.properties</value> </array> </property> --> </bean>
方式二、使用注解方式读取属性文件的值
在使用注解前,首先要告诉spring属性文件的位置:
<!-- 开启包扫描 --> <context:component-scan base-package="com.xxx"/> <!-- 定义属性文件类 --> <bean id = "propertyConfigurer" class = "org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name = "location" value = "config.properties"/> </bean>
随意定义一个被spring管理的bean:
@Component("test0") public class ForAnnotationTest { private String username; @Value("${jdbc.username}")// 可以直接注解在username字段上,在这主要表明spring通过set方法赋值 public void setUsername(String username) { this.username = username; } public String getUsername() { return username; } }
测试:
ApplicationContext context = new ClassPathXmlApplicationContext("root-context.xml"); ForAnnotationTest annotationTest = (ForAnnotationTest) context.getBean("test0"); System.out.println("username is : " + annotationTest.getUsername());
输出:
username is : mysql
方式二有另一种写法,不过稍有不同:使用${}取值可以取得属性文件中带“.”号的键所对应的值,如“jdbc.username=mysql",而使用#{}取值时,若键中带有“.”号,则会提示异常。
该写法如下:
(先将config.properties中的jdbc.username改为username)
<!-- 首先将PropertyPlaceholderConfigurer改为PropertiesFactoryBean --> <bean id = "configBean" class = "org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name = "location" value = "classpath:config.properties"> </bean>
// 修改ForAnnotationTest类中注解的取值方式 @Value("#{configBean.username}") public void setUsername(String username) { this.username = username; }
如果必须要用#{}取值方式获取带有“.”键的值(基本上不会有这种要求),可以通过#{'${}'}嵌套使用,如
@Value("#{'${jdbc.username}'}"),但前提是需要在xml中同时配置这两种取值方式的属性文件配置(上文中的两个propertyConfigurer类)。显而易见地,这种情况下使用#{}取值是不可取的。#{}方式强大在于它的运算能力,包括获取对象属性值、数值运算等。
方式三、通过Properties类和IO流,将属性文件读取到键值对的容器中,使用时直接通过键获取
1. 为了让属性文件的路径可配置,可将文件路径字符串作为一个bean,通过spring获取:
<bean id = "configPath" class = "java.lang.String"> <constructor-arg> <!-- linux 下,以tomcat目录为相对路径的写法 --> <value>file:webapps-conf/xx/xxx.properties</value> </constructor-arg> </bean>
注意:使用tomcat容器启动时,相对路径为tomcat下的bin目录; 直接调用JVM而非使用WEB容器启动时(单元测试就是其中一种),相对路径为项目目录。
2. 获取 spring 中的 bean "configPath",使用IO流创建 Properties类.
package configPack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; import java.util.Properties; /** * author: getthrough * date: 2018/2/28 * description: a class for loading properties files */ public class ConfigLoader { private static Properties properties = new Properties(); private static Logger logger = LoggerFactory.getLogger(ConfigLoader.class); // @Autowired // private static configPack.AppContext appContext;// 这里不能用注入的方式 static { try { String configPath = getConfigPath(); InputStream is = new FileInputStream(new File(configPath)); properties.load(is); logger.info("####### properties file has loaded! #######"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private static String getConfigPath() { String configPath = (String) AppContext.getBean("configPath"); logger.info("configPath:>>>>>>>>>>>>>>>>>>>" + configPath); if (null != configPath && configPath.startsWith("file:")) { configPath = configPath.replace("file:", ""); } if (null != configPath && configPath.startsWith("classpath:")) configPath = configPath.replace("classpath:", ""); return configPath; } public static String getValueByKey(String key) { return getValueByKey(key, ""); } public static String getValueByKey(String key, String defaultValue) { return properties.getProperty(key, defaultValue); } }
其中的 AppContext 类在 配置文件中定义,其类内容如下:
package configPack; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import java.io.Serializable; /** * author: getthrough * date: 2018/2/28 * description: */ //@Service public class AppContext implements ApplicationContextAware,Serializable { private static final long serialVersionUID = 4606527550169443963L; private static ApplicationContext context; public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { AppContext.setContext(applicationContext);// 通过 set 方法注入,获取 应用上下文 } public static <T> T getBean(String beanName) { if (null == context) throw new RuntimeException("ApplicationContext has not been injected!"); return (T) context.getBean(beanName); } public static <T> T getBean(Class<?> clazz) { if (null == context) throw new RuntimeException("ApplicationContext has not been injected!"); return (T) context.getBean(clazz); } public static void setContext(ApplicationContext context) { AppContext.context = context; } public static ApplicationContext getContext() { return context; } }
测试:
创建一个随项目启动即创建的 Servlet,或者 创建一个 Listener,在初始化的方法中测试效果(以Listener为例):
package configPack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * author: getthrough * date: 2018/3/5 * description: */ public class TestListener implements ServletContextListener { private Logger logger = LoggerFactory.getLogger(TestListener.class); public void contextInitialized(ServletContextEvent sce) { String valueByKey = ConfigLoader.getValueByKey("jdbc.username"); logger.info("value to \"jdbc.username\" is >>>>>>>>>>>>>>>" + valueByKey); } public void contextDestroyed(ServletContextEvent sce) { } }
输出结果:
value to "jdbc.username" is >>>>>>>>>>>>>>>root
总结
方式一读取配置文件非常适合在 spring 配置文件中获取指定位置的属性文件内容;
方式二基本属于打酱油;
方式三非常适合在具体代码中获取指定位置属性文件内容,如 ip,端口,ftp 地址等。
方式一和方式二的内容是在公司无法粘贴代码环境下写的,词语拼写很可能出错,请自行分辨!(也因此没有代码文件,如有需要,后期补充)
方式三代码地址: https://github.com/Getthrough/loadConfigFile
发表评论
-
手动实现简单的线程池
2018-05-22 00:20 622手动实现简单的线程池 写在前面: 本文使用了 Block ... -
阻塞队列
2018-05-18 17:50 0阻塞队列(BlockingQueue ... -
Java内存泄漏
2018-03-09 17:17 466Java内存泄漏 什么是内存泄漏? ... -
mq 草稿
2018-03-09 11:17 0MQTaskListener 继承 ServletCo ... -
Spring 整合 ActiveMq
2018-03-21 22:46 403Spring 整合 ActiveMq 整合步骤如下: ... -
属性文件读取方式
2018-02-28 13:36 0本文属性文件的读取主要针对于传统spring框架的项目。如使用 ... -
从观察者模式到事件驱动
2018-02-24 14:16 0当我还是个孩子...嗨, ...
相关推荐
以下是如何将日志记录与属性文件读取结合起来: ```java import java.io.FileInputStream; import java.io.IOException; import java.util.Properties; import java.util.logging.FileHandler; import java.util....
这篇博客文章“属性文件读写操作类”可能详细介绍了如何在Java中进行属性文件的操作,包括读取和写入。下面将详细阐述相关知识点。 1. **属性文件格式** 属性文件是纯文本文件,其内容通常以UTF-8编码,每一行表示...
以下是对属性文件读写操作的详细解释: 1. **属性文件格式** 属性文件由一系列键值对组成,每行一个。键和值之间用等号`=`或冒号`:`分隔,例如: ``` username=admin password=123456 ``` 空行和注释行(以`#...
C语言对HDF文件数据集和属性的读写 本文主要介绍了使用C语言对HDF( Hierarchical Data Format)文件进行数据集和属性的读写操作。HDF文件是一种高效的数据存储格式,广泛应用于科学计算、数据分析和数据存储等领域...
// 从文件读取 1024 字节的数据 file2.write(buffer, 1024); // 向文件写入 1024 字节的数据 在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开文件,就用 ifstream 来定义;如果想以输出...
这篇博客“spring,配置文件从属性文件读取JDBC连接的相关参数”将深入探讨如何实现这一功能。 首先,我们需要一个属性文件,例如`database.properties`,在这个文件中存储JDBC连接的敏感信息,如数据库URL、用户名...
"采用无缓冲方式实现文件读写" 本文档是武汉大学计算机学院《Windows原理与应用》课程实验报告,旨在介绍如何使用无缓冲方式实现文件读写。该实验报告的主要内容包括实验目的、实验设计、实验原理和实验步骤等方面...
### 属性文件读取 Java提供了`java.util.Properties`类来处理属性文件。这些文件通常具有.key=value格式。 ```java import java.io.FileInputStream; import java.util.Properties; // 读取属性文件 Properties ...
读取自定义属性文件内容,可以自己定义属性文件的名字,任何路径都可以
本篇将详细介绍如何在Java环境下读取webroot目录下的属性文件。 首先,确保属性文件已经放置在webroot目录下,例如:`/webroot/config/app.properties`。这个文件应包含键值对,如`key=value`的格式。 步骤1:导入...
本文将深入探讨如何使用Java读取PDF文件的属性,如作者、标题等元数据,以及相关的知识点。 ### 一、Java读取PDF文件属性的技术背景 在Java中读取PDF文件属性主要依赖于开源库PDFBox。PDFBox是一个用于处理PDF文档...
在本文中,我们将详细探讨如何在Java Web环境中读取`webroot`文件下的属性文件。 1. **属性文件结构** 属性文件是键值对的简单文本格式,每一行代表一个键值对,以等号`=`或冒号`:`分隔键和值。例如: ``` ...
在Java应用程序中,我们可以使用特定的类来读取和写入这些属性文件,以便在运行时动态地访问或修改配置。本文将深入探讨如何使用基于属性文件的读取类,以及`db.properties`文件在实际应用中的用途。 首先,让我们...
接下来,我们将在Java代码中读取这个属性文件。我们可以使用`java.util.Properties`类来加载和处理属性文件。以下是一个简单的示例: ```java import java.io.FileInputStream; import java.io.IOException; import...
在这段示例代码中,`read_step`函数负责执行具体的文件读取操作,并根据读取的结果来决定是否继续调用自身进行下一轮读取。一旦读取完成,就设置`Future`对象的结果。`read`函数则用于初始化读取操作,并返回一个`...
总结来说,C#通过文件流方式读取DBF文件涉及到对文件结构的深入理解,包括头部信息、字段定义和数据记录的解析。通过`FileStream`和`BinaryReader`,我们可以逐字节地读取和处理文件内容。在没有第三方库支持的情况...
这篇博文主要探讨的是如何在Java环境中读取和写入XML属性文件。 首先,我们需要了解XML文件的基本结构。一个XML文件由一系列的元素组成,每个元素由开始标签、元素内容和结束标签构成,如 `<tag>content</tag>`。...