我的需求:

  我有一个 abstract class 中包含了很多子类中需要用到的公共方法和变量,我想在抽象类中

使用@Value获取*.properties中的值。但是@Value必须要在Spring的Bean生命周期管理下才能

使用,比如类被@Controller、@Service、@Component等注解标注。那我就想在抽象类中获取

*.properties中的值,怎么办?

我项目的大概情况:

  web.xml

  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>classpath:/spring/spring-context.xml</param-value>
  4. </context-param>
  5. <listener>
  6. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  7. </listener>
  8.  
  9. <listener>
  10. <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  11. </listener>
  12. <servlet>
  13. <servlet-name>mvc-dispatcher</servlet-name>
  14. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  15. <init-param>
  16. <param-name>contextConfigLocation</param-name>
  17. <param-value>classpath:/spring/spring-mvc.xml</param-value>
  18. </init-param>
  19. <load-on-startup>1</load-on-startup>
  20. </servlet>
  21. <servlet-mapping>
  22. <servlet-name>mvc-dispatcher</servlet-name>
  23. <url-pattern>/</url-pattern>
  24. </servlet-mapping>

  spring-context.xml

  1. <context:component-scan base-package="com.hyxf.amlfetch" />
  2.  
  3. <context:annotation-config />
  4.  
  5. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  6. <property name="ignoreResourceNotFound" value="true" />
  7. <property name="locations">
  8. <list>
  9. <!--<value>classpath*:*.properties</value>--> <--这样也可以,只是感觉不是很明了-->
  10. <value>classpath*:config.properties</value>
  11. <value>classpath*:jdbc.properties</value>
  12. <value>classpath*:log4j.properties</value>
  13. </list>
  14. </property>
  15. </bean>

准备代码:

1、写一个PropertiesUtil工具类,实现EmbeddedValueResolverAware 

  1. package com.hyxf.amlfetch.common.util;
  2.  
  3. import org.springframework.context.EmbeddedValueResolverAware;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.util.StringValueResolver;
  6.  
  7. /**
  8. * 获取properties文件中的value的工具类
  9. */
  10. @Component
  11. public class PropertiesUtil implements EmbeddedValueResolverAware {
  12. private StringValueResolver stringValueResolver;
  13.  
  14. @Override
  15. public void setEmbeddedValueResolver(StringValueResolver resolver) {
  16. stringValueResolver = resolver;
  17. }
  18. public String getPropertiesValue(String name){
  19. return stringValueResolver.resolveStringValue(name);
  20. }
  21.  
  22. }

2、在需要获取*.properties值的抽象类中引入PropertiesUtil工具类,并使用@PostConstruct注解进行初始化。

  1. package com.hyxf.amlfetch.biz.service.coop;
  2.  
  3. import com.hyxf.amlfetch.common.util.PropertiesUtil;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5.  
  6. import com.hyxf.amlfetch.common.util.Logger;
  7. import com.hyxf.amlfetch.dao.mapper.aml.OdsT2aBatchMapper;
  8. import org.springframework.util.StringUtils;
  9.  
  10. import javax.annotation.PostConstruct;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13.  
  14. public abstract class AbstractFetchService<T> implements FetchService<T> {
  15.  
  16. protected Logger logger = Logger.getLogger(this.getClass());
  17.  
  18. @Autowired
  19. protected OdsT2aBatchMapper odsT2aBatchMapper;
  20.  
  21. @Autowired
  22. private PropertiesUtil propertiesUtil;
  23. private static final String DB_READ_NUM_KEY = "each_db_read_num";
  24.  
  25. private static final String DB_WRITE_NUM_KEY = "each_db_write_num";
  26.  
  27. private static Map<String, String> dbNum = new HashMap<>();
  28. /**
  29. * 索引位置
  30. */
  31. protected static final Integer FROM_INDEX = 0;
  32.  
  33. /**
  34. * 加载配置文件的值
  35. * 抽象类不能够使用@Value,在spring容器初始话的时候来获取这个值
  36. */
  37. @PostConstruct
  38. public void init() {
  39. String eachDbWriteNum = propertiesUtil.getPropertiesValue("${" + DB_WRITE_NUM_KEY + "}");
  40. if(StringUtils.isEmpty(dbNum.get(DB_WRITE_NUM_KEY))) {
  41. dbNum.put(DB_WRITE_NUM_KEY, eachDbWriteNum);
  42. }
  43. String eachDbReadNum = propertiesUtil.getPropertiesValue("${" + DB_READ_NUM_KEY + "}");
  44. if(StringUtils.isEmpty(dbNum.get(DB_READ_NUM_KEY))) {
  45. dbNum.put(DB_READ_NUM_KEY, eachDbReadNum);
  46. }
  47. }
  48.  
  49. public Integer getEachDbWriteNum() {
  50. if(StringUtils.isEmpty(dbNum.get(DB_WRITE_NUM_KEY))) {
  51. return 0;
  52. }
  53. return Integer.parseInt(dbNum.get(DB_WRITE_NUM_KEY));
  54. }
  55.  
  56. public Integer getEachDbReadNum() {
  57. if(StringUtils.isEmpty(dbNum.get(DB_READ_NUM_KEY))) {
  58. return 0;
  59. }
  60. return Integer.parseInt(dbNum.get(DB_READ_NUM_KEY));
  61. }
  62. }

  解释一下,为什么这里用了一个static的HashMap,因为这个抽象类有8个子类,其中4个class 和 4个 abstract class

所以在debug的过程中这个被@PostConstruct注解的init()方法在Spring容器启动的时候会运行8次,但是4个class是能通过

propertiesUtil获取到值的,而4个abstract class 是获取不到值的。所以就把第一次获取到的properties中的值用map存下来。

(肯定有更好的方法但是我没有发现,希望大家可以告诉我)

Spring中抽象类中使用EmbeddedValueResolverAware和@PostConstruct获取配置文件中的参数值的更多相关文章

  1. ThinkPHP 获取配置文件中的值

    C('SPECIAL_USER'):获取配置文件中的值 存入数组

  2. 获取配置文件中key=value

    之前一直是写一个方法获取配置文件中的key=value值得,现在提供更简单的. ResourceBundle 是java.utl中的一个专门针对.properties文件的. //获取配置文件对象 R ...

  3. electron-vue 项目启动动态获取配置文件中的后端服务地址

    前言 最近的项目迭代中新增一个需求,需要在electron-vue 项目打包之后,启动exe 可执行程序的时候,动态获取配置文件中的 baseUrl 作为服务端的地址.electron 可以使用 no ...

  4. web中纯java获取配置文件中的数据

    /*********获取配置文件,但配置文件中的值改变,不会随着值的改变也获取的参数值改变**********/  /**   * 原因是因为,类装载,装载完后,不会再去装载了   * *///  I ...

  5. 当From窗体中数据变化时,使用代码获取数据库中的数据然后加入combobox中并且从数据库中取得最后的结果

    private void FormLug_Load(object sender, EventArgs e) { FieldListLug.Clear();//字段清除 DI = double.Pars ...

  6. Winform中设置DevExpress的RadioGroup的items从配置文件中加载

    场景 DevExpress的RadioGroup的items选项如果是不确定的话,需要其从配置文件中加载. 实现 在项目目录下新建Config文件夹,文件夹下新建xml配置文件. <?xml v ...

  7. java获取配置文件中的key=value值

    1.献上工具类 package com.test.util; import java.io.FileInputStream; import java.io.FileNotFoundException; ...

  8. spring cloud --- config 配置中心 [本地、git获取配置文件]

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 spring cloud config 配置中心是什么? 为了统一管理配 ...

  9. Spring Boot使用@ConfigurationProperties注解获取配置文件中的属性值

    注意:这种方式要提供属性的getter/setter方法—— 如果idea报错,提示没有相应的执行器,就需要在maven中添加: (虽然不配置代码也能正常运行,作用在下面会说明) 配置了该执行器后,在 ...

随机推荐

  1. IDA分析时添加新的C语言结构体

    View - Open Subviews - Local Type - INSERT键 - 输入新结构体 - 右击"Synchornize to idb" 之后再分析处按 T 就可 ...

  2. Jar 打包与执行

    Java学习笔记之一,用于个人记录.整理自<Head First Java>. 假设有如下目录结构: 程序入口在 Jukebox8.java.这个代码文件开头是有如下这样的包声明语句的: ...

  3. js和C#互相调用

    快速上手 js和C#互相调用. C#调用js比较容易.JS调用C#代码,现有两种方法.老方法的缺点是只支持单页,如果切换页面,原有创建的变量就失效了.新方法没有这些问题. 老方法: Cefsharp ...

  4. QUrl的使用,特别是对含特殊字符的字符串进行 URL 格式化编码

    QUrl提取与写入参数QUrl url("www.baidu.com?a=666&b=888"); url.addQueryItem("); qDebug()&l ...

  5. SQL Server学习内容(一)

    SQL Server SQL Server对大小写不敏感,每条语句末端使用分号. 1.SQL命令 SELECT 从数据中提取数据 UPDATE 更新数据中的数据 DELETE 从数据库中删除数据 IN ...

  6. Jenkins 打tag回滚

    利用jenkins,从gitlab上拉取代码,然后发布,如果想进行代码回退,其实还是代码发布,拉取的时候,选择合适的标签. 一.利用Git parameter插件选择branch或tag.下面的文本参 ...

  7. 简单使用:SpringBoot整合Redis

    1.导入依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  8. Asp.net管道模型之(HttpModules 和 HttpHandler)

    上一节我们从大概范围介绍了管道模型的整体流程,我们从其中知道管道最重要的两大组件为:HttpModules 跟 HttpHandler.今天我们着重来介绍一下这两大组件 一:asp.net处理管道 从 ...

  9. 【Git版本控制】Idea中设置Git忽略对某些文件的版本追踪

    在Idea中有些本地文件无需与远程库同步,仅是本地使用.此时就需要将这些文件加入到Git的版本忽略中来. 设置步骤 1.搜索插件 .ignore,并安装 2.增加.gitignore文件 3.配置相应 ...

  10. liteos双向链表(十二)

    1. 概述 1.1 基本概念 双向链表是指含有往前和往后两个方向的链表,即每个结点中除存放下一个节点指针外,还增加一个指向其前一个节点的指针.其头指针head是唯一确定的. 从双向链表中的任意一个结点 ...