Spring读取配置文件 @Value
最近在学习Spring如何读取配置文件,记录下方便自己也方便别人;
大致分为两类吧,一种的思路是利用Spring的beanFactoryPostProcessor读取配置文件内容到内存中,也就是应用程序的某个对象的属性中,然后设置上去; 另外一种思路就是SPEL表达式,这是Spring3.x的特性,依赖于Spring expression;
简单介绍下 #{}和 ${}用法上一个小的区别:
${}如果需要写默认值的话 ${keyname : defaultValue }
#{}如果需要写默认值的话 #{ 表达式 ?: defaultValue }
第一种思路
方式一. 假设当前需求是读取某个properties文件,然后再spring XML中给对象设置属性的时候赋值;
step1.首先是如何将properties文件读取到内存中:使用ProperyPlaceHolderConfigurer对象
方案A:

如果有多个配置文件,那继续添加<value>文件资源位置</value>
或者使用下面的bean对象PropertySourcesPlaceHolderConfigurer;
方案B:

再或者使用context标签来完成: 如果有多个文件资源,使用,作为分隔符 ;其实后两种方式就是一种方式,propert-placeholder标签就是注册的PropertySourcesPlaceHolderConfigurer
方案C:

step2.第二步就是从内存中读取key-value并且设置到对象的属性上
在Spring的配置文件中,使用 ${键名} 的方式就可以注入; 注意:属性需要有对应的set方法才能够将值设置上去,static类型的变量也可以通过这种方法设置;

注意点:${}是支持嵌套的,比如下面的 ${${name}} 就等价于lvbb ${${name}1}就等价于lq

方式二. 假如项目中的bean是用的注解(我知道的四个 @Controller、@Service、@Component、@Repository),没有在Xml配置文件中定义;
step1同方式一的step1,三种方式都是可行的,额外多一种方式 定义了,其实和前面三种方式没太大区别,就是PropertyPlaceHolderConfigurer的子类;

step2
需要<context:component-scan/>标签开始包扫描,使用注解方式的bean,这样才会扫描到@Value注解

Value注解可以标注在属性上,也可以标注在set方法上;
@Value注解同样支持${ }嵌套,但是static类型的属性 我测试的时候发现是无法设置上去的。
第二种思路 SPEL表达式
#{}形式为SpringEl表达式,简称SPEL, 详细的博客见作者链接 :https://blog.csdn.net/ya_1249463314/article/details/68484422
SPEL表达式有点类似OGNL表达式,通常使用都是#{对象名.对象属性}来获取属性;
方式一. @Value注解配合 #{}表达式
step1.读取properties文件方式. 使用的是PropertiesFactoryBean,其实获取的就是Properties对象,对象名为configProperties

step2.开启@Component、@Service等注解,以及最重要的@Value注解开启使用; @Value注解开启是依赖于注册了AutowiredAnnotationBeanPostProcessor这个beanPostProcessor,而<context:component-scan/>就
帮我们完成了注册这个AutowiredAnnotationBeanPostProcessor,所以才能够使用@Value注解;
config.properties文件如下:

SPEL使用方式如下:


#{}推荐写成 #{对象名[‘属性名’]}的形式,因为属性名包含 . 分隔符的话不加单引号会解析报错;其中configProperties就是之前的Properties对象 id
此外系统JVM的参数,即System.getProperties()的参数可以直接EL表达式使用; #{systemProperties['属性名']}

当然了系统JVM参数使用${}同样可以注入:

博客最后附上我的JVM的参数,图片较长见最后。
再次附上介绍SPEL的链接,https://blog.csdn.net/ya_1249463314/article/details/68484422
SpEl表达式比较复杂,我也只是简单会用,具体实现在Spring-expression中,就像刚接触Spring一样,难以理解;
简单附上Spring解析El 表达式的demo,大致流程就是:传入了beanFactory,然后根据 id 查找 bean 就去beanFactory中查找.

JVM参数:

Spring读取配置文件 @Value的更多相关文章
- java web路径和spring读取配置文件
此篇博客缘起:部署java web系统到阿里云服务器(ubuntu14.04)的时候,有以下两个问题 找不到自定义的property配置文件 上传图片的时候找不到路径 开发的时候是在windows上的 ...
- Spring 读取配置文件(二)
Spring 读取配置文件并调用 bean package cn.com.test.receive; import org.springframework.beans.factory.annotati ...
- Spring 读取配置文件(一)
注册 @Configuration 标识的类,spring 读取配置文件的时候该类会被自动装载 package cn.com.receive;import org.springframework.be ...
- Spring读取配置文件的几种方式
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; imp ...
- Java中spring读取配置文件的几种方法
Spring读取配置XML文件分三步: 一.新建一个Java Bean: package springdemo; public class HelloBean { private String hel ...
- spring 读取配置文件
spring读取dubbo xml文件,在本项目内可以调用正常,一旦把改项目打成jar包,供其他项目调用,就会提示找不到配置文件 ClassPathXmlApplicationContext cont ...
- Spring读取配置文件,获取bean的几种方式
BeanFactory有很多实现类,通常使用 org.springframework.beans.factory.xml.XmlBeanFactory类.但对于大部分J2EE应用而言,推荐使 用App ...
- spring读取配置文件PropertyPlaceholderConfigurer类的使用
这里主要介绍PropertyPlaceholderConfigurer这个类的使用,spring中的该类主要用来读取配置文件并将配置文件中的变量设置到上下文环境中,并进行赋值. 一.此处使用list标 ...
- 关于spring读取配置文件的两种方式
很多时候我们把需要随时调整的参数需要放在配置文件中单独进行读取,这就是软编码,相对于硬编码,软编码可以避免频繁修改类文件,频繁编译,必要时只需要用文本编辑器打开配置文件更改参数就行.但没有使用框架之前 ...
随机推荐
- Windows 95 输入法编辑器
Windows 95 输入法编辑器 翻译:戴石麟译自微软的MSDN DDK 关于Windows 95的多语言IME(输入法编辑器) 在Windows 95中,IME以动态连接库(DLL)的形式提供,与 ...
- 初始kafka
kafka 简介 Kafka是Linkedin于2010年12月份开源的消息系统 一种分布式的.基于发布/订阅的消息系统 ,另外提供数据分布式缓存功能 特点 消息持久化:通过O(1)的磁盘数据结构提供 ...
- tarjan算法--求解无向图的割点和桥
1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥 也就是说 无向连通图中,如果删除某边后,图变成不连通,则称该边为桥 2.割点:无向连通图中,如 ...
- robotium测试创建java文件和junit文件区别
两者本身差别不大,只是构造方式不同,我一般都用java文件来创建. 1.当有源码测试时,创建junit测试文件 ActivityInstrumentationTestCase2<T>T可以 ...
- poj3253哈夫曼树
Fence Repair Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java ...
- WPF学习笔记(5):两个DataGrid的滚动条实现同步滚动
效果:两个DataGrid的滚动条实现同步滚动. 代码参考了博客园chuncn的文章<.net中同步多个ScrollViewer滚动的四种方法>,原文是针对ListBox的.现改为针对Da ...
- .net mvc 站点自带简易SSL加密传输
因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net 解密返回后端.net用rsa/aes 或 rsa/ ...
- SQL注入之PHP-MySQL实现手工注入-字符型
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎 ...
- 给Ubuntu18.04安装mac os主题<转载>
给Ubuntu18.04安装mac os主题 转载来自 https://www.cnblogs.com/feipeng8848(作者) 参考文献 https://linuxhint.com/gnom ...
- C++ 设置Java 环境变量完整的例子
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <iostream& ...