Spring中抽象类中使用EmbeddedValueResolverAware和@PostConstruct获取配置文件中的参数值
我的需求:
我有一个 abstract class 中包含了很多子类中需要用到的公共方法和变量,我想在抽象类中
使用@Value获取*.properties中的值。但是@Value必须要在Spring的Bean生命周期管理下才能
使用,比如类被@Controller、@Service、@Component等注解标注。那我就想在抽象类中获取
*.properties中的值,怎么办?
我项目的大概情况:
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/spring-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
spring-context.xml
<context:component-scan base-package="com.hyxf.amlfetch" /> <context:annotation-config /> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<!--<value>classpath*:*.properties</value>--> <--这样也可以,只是感觉不是很明了-->
<value>classpath*:config.properties</value>
<value>classpath*:jdbc.properties</value>
<value>classpath*:log4j.properties</value>
</list>
</property>
</bean>
准备代码:
1、写一个PropertiesUtil工具类,实现EmbeddedValueResolverAware
package com.hyxf.amlfetch.common.util; import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.stereotype.Component;
import org.springframework.util.StringValueResolver; /**
* 获取properties文件中的value的工具类
*/
@Component
public class PropertiesUtil implements EmbeddedValueResolverAware {
private StringValueResolver stringValueResolver; @Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
stringValueResolver = resolver;
}
public String getPropertiesValue(String name){
return stringValueResolver.resolveStringValue(name);
} }
2、在需要获取*.properties值的抽象类中引入PropertiesUtil工具类,并使用@PostConstruct注解进行初始化。
package com.hyxf.amlfetch.biz.service.coop; import com.hyxf.amlfetch.common.util.PropertiesUtil;
import org.springframework.beans.factory.annotation.Autowired; import com.hyxf.amlfetch.common.util.Logger;
import com.hyxf.amlfetch.dao.mapper.aml.OdsT2aBatchMapper;
import org.springframework.util.StringUtils; import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map; public abstract class AbstractFetchService<T> implements FetchService<T> { protected Logger logger = Logger.getLogger(this.getClass()); @Autowired
protected OdsT2aBatchMapper odsT2aBatchMapper; @Autowired
private PropertiesUtil propertiesUtil; private static final String DB_READ_NUM_KEY = "each_db_read_num"; private static final String DB_WRITE_NUM_KEY = "each_db_write_num"; private static Map<String, String> dbNum = new HashMap<>(); /**
* 索引位置
*/
protected static final Integer FROM_INDEX = 0; /**
* 加载配置文件的值
* 抽象类不能够使用@Value,在spring容器初始话的时候来获取这个值
*/
@PostConstruct
public void init() {
String eachDbWriteNum = propertiesUtil.getPropertiesValue("${" + DB_WRITE_NUM_KEY + "}");
if(StringUtils.isEmpty(dbNum.get(DB_WRITE_NUM_KEY))) {
dbNum.put(DB_WRITE_NUM_KEY, eachDbWriteNum);
}
String eachDbReadNum = propertiesUtil.getPropertiesValue("${" + DB_READ_NUM_KEY + "}");
if(StringUtils.isEmpty(dbNum.get(DB_READ_NUM_KEY))) {
dbNum.put(DB_READ_NUM_KEY, eachDbReadNum);
}
} public Integer getEachDbWriteNum() {
if(StringUtils.isEmpty(dbNum.get(DB_WRITE_NUM_KEY))) {
return 0;
}
return Integer.parseInt(dbNum.get(DB_WRITE_NUM_KEY));
} public Integer getEachDbReadNum() {
if(StringUtils.isEmpty(dbNum.get(DB_READ_NUM_KEY))) {
return 0;
}
return Integer.parseInt(dbNum.get(DB_READ_NUM_KEY));
}
}
解释一下,为什么这里用了一个static的HashMap,因为这个抽象类有8个子类,其中4个class 和 4个 abstract class
所以在debug的过程中这个被@PostConstruct注解的init()方法在Spring容器启动的时候会运行8次,但是4个class是能通过
propertiesUtil获取到值的,而4个abstract class 是获取不到值的。所以就把第一次获取到的properties中的值用map存下来。
(肯定有更好的方法但是我没有发现,希望大家可以告诉我)
Spring中抽象类中使用EmbeddedValueResolverAware和@PostConstruct获取配置文件中的参数值的更多相关文章
- ThinkPHP 获取配置文件中的值
C('SPECIAL_USER'):获取配置文件中的值 存入数组
- 获取配置文件中key=value
之前一直是写一个方法获取配置文件中的key=value值得,现在提供更简单的. ResourceBundle 是java.utl中的一个专门针对.properties文件的. //获取配置文件对象 R ...
- electron-vue 项目启动动态获取配置文件中的后端服务地址
前言 最近的项目迭代中新增一个需求,需要在electron-vue 项目打包之后,启动exe 可执行程序的时候,动态获取配置文件中的 baseUrl 作为服务端的地址.electron 可以使用 no ...
- web中纯java获取配置文件中的数据
/*********获取配置文件,但配置文件中的值改变,不会随着值的改变也获取的参数值改变**********/ /** * 原因是因为,类装载,装载完后,不会再去装载了 * */// I ...
- 当From窗体中数据变化时,使用代码获取数据库中的数据然后加入combobox中并且从数据库中取得最后的结果
private void FormLug_Load(object sender, EventArgs e) { FieldListLug.Clear();//字段清除 DI = double.Pars ...
- Winform中设置DevExpress的RadioGroup的items从配置文件中加载
场景 DevExpress的RadioGroup的items选项如果是不确定的话,需要其从配置文件中加载. 实现 在项目目录下新建Config文件夹,文件夹下新建xml配置文件. <?xml v ...
- java获取配置文件中的key=value值
1.献上工具类 package com.test.util; import java.io.FileInputStream; import java.io.FileNotFoundException; ...
- spring cloud --- config 配置中心 [本地、git获取配置文件]
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 spring cloud config 配置中心是什么? 为了统一管理配 ...
- Spring Boot使用@ConfigurationProperties注解获取配置文件中的属性值
注意:这种方式要提供属性的getter/setter方法—— 如果idea报错,提示没有相应的执行器,就需要在maven中添加: (虽然不配置代码也能正常运行,作用在下面会说明) 配置了该执行器后,在 ...
随机推荐
- c# "As" 与 "Is"效率 (原发布csdn 2017-10-07 11:49:18)
十一长假就要过去了,今年假期没有回家,一个人闲着无聊就在看C#语言规范5.0中文版.昨天看了 is运算符和 as运算符,平时项目中也有用到这两种符号,对于其效率也没有进行比较过,趁着假期有空,先看下效 ...
- 面试官都叫好的Synchronized底层实现,这工资开多少一个月?
本文为死磕Synchronized底层实现第三篇文章,内容为重量级锁实现. 本系列文章将对HotSpot的synchronized锁实现进行全面分析,内容包括偏向锁.轻量级锁.重量级锁的加锁.解锁.锁 ...
- Linux链接文件——管理链接文件的命令
Linux链接文件——管理链接文件的命令 摘要:本文主要学习了在Linux系统中创建链接文件的命令. ln命令 ln命令用于给文件创建链接,是Link的缩写. 基本语法 ln [选项] 源文件 目标文 ...
- JZOJ 2158. 蚂蚁
这个是今天早上比赛的内容,比较水给大伙们讲一下(我只会这一个) 题目大意: n只蚂蚁以每秒1cm的速度在长为L cm(厘米,不是lcm)的竿子上爬行.当蚂蚁爬到竿子的端点时就会掉落.由于竿子太细,两 ...
- 洛谷 p1541乌龟棋
洛谷 p1541乌龟棋 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行NN个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第NN格是终点,游戏 ...
- 软件设计师14-UML建模
UML图 用例图 用例图:参与者.用例 用例之间的关系:包含关系.扩展关系.泛化关系. 用例的包含关系:查询数据外借信息包含用户登录. 用例的扩展关系:修改之前要先查询,则修改信息包含查询信息用例 类 ...
- 图解Java数据结构之双向链表
上一篇文章说到了单链表,也通过案例具体实现了一下,但是单链表的缺点也显而易见. 单向链表查找的方向只能是一个方向 单向链表不能自我删除,需要靠辅助节点 而双向链表则能够很轻松地实现上面的功能. 何为双 ...
- Telegram Android源码问题汇总 持续更新
libtgvoip目录为空 git clone下来的工程中带有submodule时,submodule的内容没有下载下来,执行如下命令 cd Telegram git submodule update ...
- Mysql时区无法识别
Unable to connect to database. Tried 1 times {:error_message=>“Java::JavaSql::SQLException: The s ...
- Phoenix 无法启动报错: java.net.BindException: Address already in use
一.问题描述 i. 登录Ambari发现有一个节点的 Phoenix 无法启动 ii. 在Ambari上点击“Start”,监控 Phoenix 日志文件 iii. Phoenix 日志如下: [ro ...