Spring的加载机制导致不同SpringBoot启动方式下@Value注解失效
问题参考链接: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注解失效相关推荐
- Alian解读SpringBoot 2.6.0 源码(一):SpringApplication对象创建(Spring工厂加载机制)
目录 一.背景 二.SpringApplication实例化 2.1.实例化方法入口 2.2.推断应用程序类型 2.3.Spring工厂加载机制 2.3.1.获取Spring工厂实例(重要) 2.3. ...
- Spring懒加载机制原理和配置讲解
一.什么是懒加载 Spring默认会在容器初始化的过程中,解析xml或注解,创建配置为单例的bean并保存到一个map中,这样的机制在bean比较少时问题不大,但一旦bean非常多时,spring需要 ...
- spring security加载原理(基于springboot)
一.基本架构 二.自动配置原理 依据 Spring Boot 自动配置原理,其会自动加载spring-boot-autoconfigure.jar中/META-INF/spring.factories ...
- Spring Boot 扩展点应用之工厂加载机制
Spring 工厂加载机制,即 Spring Factories Loader,核心逻辑是使用 SpringFactoriesLoader 加载由用户实现的类,并配置在约定好的META-INF/spr ...
- java类spring加载_spring的加载机制?
1,今天面试官问我spring的加载机制有哪些---这么"抽象"的问题作为一个十多年经验的自己写过MVC,IOC,ORM, 等各种中间件小框架的开发人员也回答不出来~ 确切的说是无 ...
- java 加载spring_spring的加载机制?
1,今天面试官问我spring的加载机制有哪些---这么"抽象"的问题作为一个十多年经验的自己写过MVC,IOC,ORM, 等各种中间件小框架的开发人员也回答不出来~ 确切的说是无 ...
- Spring中ApplicationContext加载机制和配置初始化
转自:http://liuwei1578.blog.163.com/blog/static/495803642007116111923195/ Spring中ApplicationContext加载机 ...
- java 懒加载原理_SpringBoot新特性之全局懒加载机制
关于延迟加载 在 Spring 中,默认情况下所有定的 bean 及其依赖项目都是在应用启动时创建容器上下文是被初始化的.测试代码如下: @Slf4j @Configuration public cl ...
- Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)...
本文原文连接: http://blog.csdn.net/bluishglc/article/details/7596118 ,转载请注明出处! 有时候你会发现过去一直启动正常的系统,某天启动时会报出 ...
最新文章
- dp凸优化/wqs二分学习笔记(洛谷4383 [八省联考2018]林克卡特树lct)
- 【Android 进程保活】oom_adj 值 ( oom_adj 值对应的进程优先级 | oom_adj 值动态改变 | 进程保活优化方向 )
- 融合BI+AI,新一代增强型数据分析让制造企业高效解决故障预测分析问题
- java dom获取属性值_java – 获取dom节点的属性
- 网站程序数据库怎么上传到服务器上,网站的数据库怎么上传到服务器
- 三、服务器和客户端的信息函数
- GitHub 一周热点:听说程序员都是颜控?
- [摘自MSDN] ASP.Net2.0学习 [1] 母版页 7 : 母版页和内容页中的事件
- 如何注释ascx中的代码
- atitit.seo 发帖关键词以及链接的制作.doc
- vue element ui_vue+element-ui实现表格里嵌套表格
- 微信小程序 支付宝小程序 实现省市区县四级联动
- linux下无线USB网卡驱动安装
- 转载-GNS3安装和使用教程(超详细)
- NBMA网络中的OSPF实验(MGRE)
- mac android 模拟器耗电,Android模拟器崩溃在Mac
- 怎样学习计算机语言?
- java虚拟机 (JVM)
- 一个新手村的软件测试求职之路的小心得
- MATLAB中newff新旧区别
热门文章
- 《理想之城》“打光太暗”是有意为之?算法工程师揭秘什么才是“好画面”...
- MacBook Pro、iPad所需OLED屏幕有望由三星供应
- 小米平板5或无缘MIUI 13:搭配骁龙870 预装MIUI 12.5系统
- 年轻人原地过年,也不忘搞钱
- 溢价28倍!罗永浩的直播公司要卖了:“真还传”提前上演!
- 瑞典禁止在5G网络中用华为和中兴设备 同时也将移除老设备
- 马斯克身家742亿美元超微软前CEO鲍尔默 成全球第5大富豪
- 锂电设备商联赢激光6月22日科创板上市
- 中车四方时速600公里高速磁浮试验样车试跑成功
- 小米10青春版跑分流出:搭载骁龙720G芯片 下周一见!