问题参考链接:https://blog.csdn.net/u011958281/article/details/81531676

背景:

项目使用application.yml文件自定义参数,我在配置文件中约定好一个"密码",用来做请求的验证,即请求方和响应方都需要配置一个一模一样的"密码",程序需要在运行的时候从配置文件中获取这个"密码",而目前最便捷的是使用@Value注解获取配置文件中的值。

问题产生:

请求方在执行请求的时候,在请求服务器的@Controller层通过@Value注解获取这个参数值。响应方通过@WebFilter在程序初始化的时候(InitFilter方法中)预先通过@Value注解获取这个参数值。

在使用SpringBoot的内置Tomcat的时候,直接启动@SpringBootApplication标注的启动类,两个地方都能够获取到参数值。

但是我的项目使用mvn插件打包相当麻烦,要使用更加便捷的使用外置Tomcat启动,然后将生成的class文件直接扔在服务器上运行。所以只能使用外部的Tomcat来启动我的SpringBoot程序。

这个时候,问题出现了:请求方的@Controller层中仍能正常通过@Value注解获取参数值,而响应方的@WebFilter却获取失败。

附请求方的Controller代码和响应方的WebFilter代码

@Controller
/**请求方相关的代码就在这里了直接通过main方法获取肯定是拿不到参数值的,我也不是这个原因
*/
public class DoRequestController {@Value("${secret}")private String secret;@RequestMapping("getSecret")@ResponseBodypublic String getSecret(){//从springboot的配置文件中获取@Value对应的参数值//SpringBoot的启动类启动或者外部的Tomcat启动都可以如意拿取到System.out.println("secret: " + secret);return secret;}
}
/**这个是请求方的一个过滤器相关代码
*/
@WebFilter(urlPatterns = { "/*"})
public class SignAuthenFilter implements Filter {@Value("${secret}")private String secret;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//在初始化阶段,我就通过输出查看参数值是否成功获取//诡异的是SpringBoot的启动类启动,能够拿到//而外部Tomcat启动,就拿不到~System.out.println("获取secret: " + secret);}//doFilter方法不相干,所以没有展示了
}
# 这个是application.yml文件中配置的参数
secret: XMTX

尝试解决:

我在想是不是@Value注解抽风了,我又使用了网上搜集的,使用@Configration注解标注类、使用Enviroment织入需要获取参数值的类中从而通过enviroment对象获取参数值,等等。都不行~

导致问题的原因:

浏览参考链接的时候,发现该博主提到了"参数注入"的概念,也就是所谓的Spring的加载机制问题。在某些场景Spring做了优化(像前面的@WebFilter本来是无法通过@Value注解获取参数值的,但是因为SpringBoot是Spring的亲儿子,所以我用SpringBoot的启动类启动可以正常获取到参数值),而像我这种通过外置Tomcat的方式启动,则没有被优化~(也是我猜的,也许真是我哪里没写对)。

解决方法:

参考该博主的,不能通过参数注入(SpringBoot启动类启动无视),而是使用初始化类的方式,将配置信息集中初始化。

/**该类的工作原理是利用Java的类加载机制你要通过该工具类获取属性值,则先要加载这个工具类的静态代码块balabala~反正是他会先从配置文件中读取属性,然后返回给你
*/
public class PropertyUtil {private static final Logger logger = LoggerFactory.getLogger(PropertyUtil.class);private static Properties props;static {loadProps();}synchronized static private void loadProps() {logger.info("start to load properties.......");props = new Properties();InputStream in = null;try {in = PropertyUtil.class.getClassLoader().getResourceAsStream("application.properties"); //具体什么文件就写什么props.load(in);logger.info(name);} catch (FileNotFoundException e) {logger.error("properties not found!");} catch (IOException e) {logger.error("IOException");} finally {try {if (null != in) {in.close();}} catch (IOException e) {logger.error("properties close Exception!");}}// logger.info(props);logger.info("load properties over...........");}public static String getProperty(String key) {if (null == props) {loadProps();}return props.getProperty(key);}
}

使用方式就是如下,本来你要通过@Value注解获取到的属性值,现在通过该工具类直接通过对应的参数名拿

String secret = PropertyUtil.getProperty("secret");

感悟:

只能说自己的能力很差,这么明显的问题还在各种尝试~

Spring的加载机制导致不同SpringBoot启动方式下@Value注解失效相关推荐

  1. Alian解读SpringBoot 2.6.0 源码(一):SpringApplication对象创建(Spring工厂加载机制)

    目录 一.背景 二.SpringApplication实例化 2.1.实例化方法入口 2.2.推断应用程序类型 2.3.Spring工厂加载机制 2.3.1.获取Spring工厂实例(重要) 2.3. ...

  2. Spring懒加载机制原理和配置讲解

    一.什么是懒加载 Spring默认会在容器初始化的过程中,解析xml或注解,创建配置为单例的bean并保存到一个map中,这样的机制在bean比较少时问题不大,但一旦bean非常多时,spring需要 ...

  3. spring security加载原理(基于springboot)

    一.基本架构 二.自动配置原理 依据 Spring Boot 自动配置原理,其会自动加载spring-boot-autoconfigure.jar中/META-INF/spring.factories ...

  4. Spring Boot 扩展点应用之工厂加载机制

    Spring 工厂加载机制,即 Spring Factories Loader,核心逻辑是使用 SpringFactoriesLoader 加载由用户实现的类,并配置在约定好的META-INF/spr ...

  5. java类spring加载_spring的加载机制?

    1,今天面试官问我spring的加载机制有哪些---这么"抽象"的问题作为一个十多年经验的自己写过MVC,IOC,ORM, 等各种中间件小框架的开发人员也回答不出来~ 确切的说是无 ...

  6. java 加载spring_spring的加载机制?

    1,今天面试官问我spring的加载机制有哪些---这么"抽象"的问题作为一个十多年经验的自己写过MVC,IOC,ORM, 等各种中间件小框架的开发人员也回答不出来~ 确切的说是无 ...

  7. Spring中ApplicationContext加载机制和配置初始化

    转自:http://liuwei1578.blog.163.com/blog/static/495803642007116111923195/ Spring中ApplicationContext加载机 ...

  8. java 懒加载原理_SpringBoot新特性之全局懒加载机制

    关于延迟加载 在 Spring 中,默认情况下所有定的 bean 及其依赖项目都是在应用启动时创建容器上下文是被初始化的.测试代码如下: @Slf4j @Configuration public cl ...

  9. Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)...

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7596118 ,转载请注明出处! 有时候你会发现过去一直启动正常的系统,某天启动时会报出 ...

最新文章

  1. dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)
  2. 【Android 进程保活】oom_adj 值 ( oom_adj 值对应的进程优先级 | oom_adj 值动态改变 | 进程保活优化方向 )
  3. 融合BI+AI,新一代增强型数据分析让制造企业高效解决故障预测分析问题
  4. java dom获取属性值_java – 获取dom节点的属性
  5. 网站程序数据库怎么上传到服务器上,网站的数据库怎么上传到服务器
  6. 三、服务器和客户端的信息函数
  7. GitHub 一周热点:听说程序员都是颜控?
  8. [摘自MSDN] ASP.Net2.0学习 [1] 母版页 7 : 母版页和内容页中的事件
  9. 如何注释ascx中的代码
  10. atitit.seo 发帖关键词以及链接的制作.doc
  11. vue element ui_vue+element-ui实现表格里嵌套表格
  12. 微信小程序 支付宝小程序 实现省市区县四级联动
  13. linux下无线USB网卡驱动安装
  14. 转载-GNS3安装和使用教程(超详细)
  15. NBMA网络中的OSPF实验(MGRE)
  16. mac android 模拟器耗电,Android模拟器崩溃在Mac
  17. 怎样学习计算机语言?
  18. java虚拟机 (JVM)
  19. 一个新手村的软件测试求职之路的小心得
  20. MATLAB中newff新旧区别

热门文章

  1. 《理想之城》“打光太暗”是有意为之?算法工程师揭秘什么才是“好画面”...
  2. MacBook Pro、iPad所需OLED屏幕有望由三星供应
  3. 小米平板5或无缘MIUI 13:搭配骁龙870 预装MIUI 12.5系统
  4. 年轻人原地过年,也不忘搞钱
  5. 溢价28倍!罗永浩的直播公司要卖了:“真还传”提前上演!
  6. 瑞典禁止在5G网络中用华为和中兴设备 同时也将移除老设备
  7. 马斯克身家742亿美元超微软前CEO鲍尔默 成全球第5大富豪
  8. 锂电设备商联赢激光6月22日科创板上市
  9. 中车四方时速600公里高速磁浮试验样车试跑成功
  10. 小米10青春版跑分流出:搭载骁龙720G芯片 下周一见!