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中添加: (虽然不配置代码也能正常运行,作用在下面会说明) 配置了该执行器后,在 ...
随机推荐
- IDA分析时添加新的C语言结构体
View - Open Subviews - Local Type - INSERT键 - 输入新结构体 - 右击"Synchornize to idb" 之后再分析处按 T 就可 ...
- Jar 打包与执行
Java学习笔记之一,用于个人记录.整理自<Head First Java>. 假设有如下目录结构: 程序入口在 Jukebox8.java.这个代码文件开头是有如下这样的包声明语句的: ...
- js和C#互相调用
快速上手 js和C#互相调用. C#调用js比较容易.JS调用C#代码,现有两种方法.老方法的缺点是只支持单页,如果切换页面,原有创建的变量就失效了.新方法没有这些问题. 老方法: Cefsharp ...
- QUrl的使用,特别是对含特殊字符的字符串进行 URL 格式化编码
QUrl提取与写入参数QUrl url("www.baidu.com?a=666&b=888"); url.addQueryItem("); qDebug()&l ...
- SQL Server学习内容(一)
SQL Server SQL Server对大小写不敏感,每条语句末端使用分号. 1.SQL命令 SELECT 从数据中提取数据 UPDATE 更新数据中的数据 DELETE 从数据库中删除数据 IN ...
- Jenkins 打tag回滚
利用jenkins,从gitlab上拉取代码,然后发布,如果想进行代码回退,其实还是代码发布,拉取的时候,选择合适的标签. 一.利用Git parameter插件选择branch或tag.下面的文本参 ...
- 简单使用:SpringBoot整合Redis
1.导入依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Asp.net管道模型之(HttpModules 和 HttpHandler)
上一节我们从大概范围介绍了管道模型的整体流程,我们从其中知道管道最重要的两大组件为:HttpModules 跟 HttpHandler.今天我们着重来介绍一下这两大组件 一:asp.net处理管道 从 ...
- 【Git版本控制】Idea中设置Git忽略对某些文件的版本追踪
在Idea中有些本地文件无需与远程库同步,仅是本地使用.此时就需要将这些文件加入到Git的版本忽略中来. 设置步骤 1.搜索插件 .ignore,并安装 2.增加.gitignore文件 3.配置相应 ...
- liteos双向链表(十二)
1. 概述 1.1 基本概念 双向链表是指含有往前和往后两个方向的链表,即每个结点中除存放下一个节点指针外,还增加一个指向其前一个节点的指针.其头指针head是唯一确定的. 从双向链表中的任意一个结点 ...