Spring读取properties内容
对于SpringBoot的项目,读取配置文件的内容非常简单,但是对于spring的项目,比如ssm项目,读取配置文件的内容需要手动配置。在使用注入方式之前,默认已经有一个基本ssm框架的空项目。
可参考项目源码:https://github.com/zhongyushi-git/spring-collection.git。下载代码后,示例代码在spring-properties文件夹下。
1.使用xml方式注入
一般使用xml方式注入数据库的基本信息。
1)在资源目录下新建db.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/db2020?characterEncoding=utf-8 jdbc.username=root jdbc.password=zys123456
2)在applicationContext.xml中加载配置文件
<!-- 配置数据源dataSource -->
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxActive" value="10"/>
<property name="maxIdle" value="5"/>
</bean>
自此,数据库就可以访问了。xml方式注入到此结束。很多时候还需要通过java代码的方式读取配置文件的内容,下面进行详细的介绍。
2.@Value+@PropertySource注入
使用@Value注解方式注入配置文件的内容是最常用的方式,也是spring推荐的方式。
1)新建SystemProperties类,用于指定配置的路径。
package com.zxh.entity; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; @Component @PropertySource({"classpath:app.properties"}) public class SystemProperties {}
使用@PropertySource注解来指定配置文件的路径。当需要同时读取多个配置文件的内容时,直接在大括号后面使用逗号分隔即可,如下:
@PropertySource({"classpath:app.properties","classpath:db.properties"})
2)新建配置文件app.properties
name=zhongxiaohei password=1234 app.name=xiaoxixi app.password=000000 china_name=钟小嘿
3)新建UserController进行接口,使用@value注解和${}获取内容
package com.zxh.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Value("${name}") private String name1; @Value("${app.name}") private String name2; @Value("${china_name}") private String chinaName; @GetMapping("/get1") public String get1(){ return name1; } @GetMapping("/get2") public String get2(){ return name2; } @GetMapping("/get3") public String get3(){ return chinaName; } }
4)配置tomcat,启动项目,打开浏览器,按照下面的顺序访问:
访问http://localhost:8080/get1,返回 { data: "zhongxiaohei" },读取文件正常。
访问http://localhost:8080/get2,返回 { data: "xiaoxixi" },读取文件正常。
访问http://localhost:8080/get3,返回 { data: "钟小嘿" },读取文件正常。
5)代码分析。
在app.properties文件中,分别使用了一级和二级的配置,二级配置之前使用"."分隔,但是它们的读取方式都一样的。
需要注意的是,使用@Value时,对于参数"username"和"user.name"不能使用,它有默认值,是当前操作系统的名称。如果需要使用,可在前面加上前缀。
3.@Value+Bean注入
1)在applicationContext.xml中加载配置文件
<!-- spring加载配置文件 -->
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:app.properties</value>
</list>
</property>
</bean>
这里只加载了单个文件,如果需要加载多个文件,直接写多个<value>标签,标明文件的位置即可,如
<list>
<value>classpath:app.properties</value>
<value>classpath:db.properties</value>
<value>classpath:aaa.properties</value>
</list>
2)在UserController接口,使用@value注解和#{}获取内容。添加两个访问接口:
@Value("#{configProperties.name}") private String name3; @Value("#{configProperties['app.name']}") private String name4; @GetMapping("/get4") public JSONObject get4() { JSONObject json = new JSONObject(); json.put("data", name3); return json; } @GetMapping("/get5") public JSONObject get5() { JSONObject json = new JSONObject(); json.put("data", name4); return json; }
3)重启tomcat,分别访问get4和get5,数据正常返回。分析如下:
注入的前缀是"configProperties",原因是在获取内容时,需要使用applicationContext.xml中配置的bean的id值作为前缀。这个id值是自定义的,但需要保持两者一致,否则获取不到内容。
对于一级和二级的配置,读取方式有所不同。实际上都是可以使用中括号的方式注入的,但是为了书写简单,就省略了中括号。