Spring读取配置文件 @Value

摘要:
最近,我一直在学习Spring如何读取配置文件,以方便我和其他人进行记录;它大致可以分为两类。一种想法是使用Spring的beanFactoryPostProcessor将配置文件的内容读入内存,即设置应用程序中对象的属性;另一个想法是SPEL表达式,它是Spring3.x的一个特性,依赖于Spring表达式;简要介绍#{}和${}用法的一个小差异:${

最近在学习Spring如何读取配置文件,记录下方便自己也方便别人;

  大致分为两类吧,一种的思路是利用Spring的beanFactoryPostProcessor读取配置文件内容到内存中,也就是应用程序的某个对象的属性中,然后设置上去; 另外一种思路就是SPEL表达式,这是Spring3.x的特性,依赖于Spring expression;

   简单介绍下 #{}和  ${}用法上一个小的区别:

    ${}如果需要写默认值的话  ${keyname  :  defaultValue }

    #{}如果需要写默认值的话  #{ 表达式  ?:   defaultValue } 

第一种思路

方式一.  假设当前需求是读取某个properties文件,然后再spring XML中给对象设置属性的时候赋值;

step1.首先是如何将properties文件读取到内存中:使用ProperyPlaceHolderConfigurer对象

方案A:

Spring读取配置文件 @Value第1张

如果有多个配置文件,那继续添加<value>文件资源位置</value>

或者使用下面的bean对象PropertySourcesPlaceHolderConfigurer;

方案B:

Spring读取配置文件 @Value第2张

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

方案C:

Spring读取配置文件 @Value第3张

step2.第二步就是从内存中读取key-value并且设置到对象的属性上

在Spring的配置文件中,使用  ${键名} 的方式就可以注入;   注意:属性需要有对应的set方法才能够将值设置上去,static类型的变量也可以通过这种方法设置;

Spring读取配置文件 @Value第4张

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

Spring读取配置文件 @Value第5张

方式二.  假如项目中的bean是用的注解(我知道的四个 @Controller、@Service、@Component、@Repository),没有在Xml配置文件中定义;

step1同方式一的step1,三种方式都是可行的,额外多一种方式 定义了,其实和前面三种方式没太大区别,就是PropertyPlaceHolderConfigurer的子类;

Spring读取配置文件 @Value第6张

step2

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

Spring读取配置文件 @Value第7张Spring读取配置文件 @Value第8张  Value注解可以标注在属性上,也可以标注在set方法上;

@Value注解同样支持${ }嵌套,但是static类型的属性 我测试的时候发现是无法设置上去的。

第二种思路  SPEL表达式

  #{}形式为SpringEl表达式,简称SPEL, 详细的博客见作者链接 :https://blog.csdn.net/ya_1249463314/article/details/68484422

SPEL表达式有点类似OGNL表达式,通常使用都是#{对象名.对象属性}来获取属性;

 

方式一. @Value注解配合 #{}表达式

step1.读取properties文件方式.  使用的是PropertiesFactoryBean,其实获取的就是Properties对象,对象名为configProperties

Spring读取配置文件 @Value第9张

step2.开启@Component、@Service等注解,以及最重要的@Value注解开启使用; @Value注解开启是依赖于注册了AutowiredAnnotationBeanPostProcessor这个beanPostProcessor,而<context:component-scan/>就

帮我们完成了注册这个AutowiredAnnotationBeanPostProcessor,所以才能够使用@Value注解;

config.properties文件如下:

Spring读取配置文件 @Value第10张

SPEL使用方式如下:

Spring读取配置文件 @Value第11张Spring读取配置文件 @Value第12张

#{}推荐写成   #{对象名[‘属性名’]}的形式,因为属性名包含 . 分隔符的话不加单引号会解析报错;其中configProperties就是之前的Properties对象 id

此外系统JVM的参数,即System.getProperties()的参数可以直接EL表达式使用; #{systemProperties['属性名']}

Spring读取配置文件 @Value第13张

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

Spring读取配置文件 @Value第14张

博客最后附上我的JVM的参数,图片较长见最后。

再次附上介绍SPEL的链接,https://blog.csdn.net/ya_1249463314/article/details/68484422

SpEl表达式比较复杂,我也只是简单会用,具体实现在Spring-expression中,就像刚接触Spring一样,难以理解;

简单附上Spring解析El 表达式的demo,大致流程就是:传入了beanFactory,然后根据 id 查找 bean 就去beanFactory中查找.

Spring读取配置文件 @Value第15张

JVM参数:

 Spring读取配置文件 @Value第16张

免责声明:文章转载自《Spring读取配置文件 @Value》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于2.4G和5G低速率(续)桌面程序开发入门(WinForm with C#)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

二、给openTCS4.12做汉化

openTCS目前支持英语和德语 我们今天讲解如何汉化 1.修改配置文件 (1)修改openTCS-Kernel的配置文件(将语言改成chinese) (2) 修改openTCS-KernelControlCenter的配置文件 (3)修改openTCS-PlantOverview的配置文件 2.新增多语言资源文件 将项目中所有的资源文件都复制两份(下图只...

Spring Boot集成MyBatis的2种方式

目录 写在前面 准备工作 配置数据库驱动 配置数据源 原生集成MyBatis 依赖配置 注册MyBatis核心组件 定义并使用映射器 通过MyBatis-Spring-Boot-Starter集成 默认配置 高级定制 总结与比较 写在前面 最近总是有同事和技术群的朋友提问在Spring Boot中使用MyBatis时遇到的问题,大多...

java实时监听日志写入kafka

目的 实时监听某目录下的日志文件,如有新文件切换到新文件,并同步写入kafka,同时记录日志文件的行位置,以应对进程异常退出,能从上次的文件位置开始读取(考虑到效率,这里是每100条记一次,可调整)   源码: [java] view plain copy  import java.io.BufferedReader;   import ja...

linux中直接修改jar包内配置文件

https://www.cnblogs.com/bbbing/p/11011410.html (1)使用jar tvf jar名称 | grep 目标文件名 查询出目标文件在jar包中的目录:jar tvf service-0.0.1-SNAPSHOT.jar |grep config.properties(2)使用jar xvf jar名称 目标文件名(...

3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)

1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置; 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置 1.命令行参数 所有的配置都可以在命令行上进行指定 先打包在进行测试 java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=80...

【Spring】07 后续的学习补充 vol1

控制反转Inverse Of Control的演变: 在之前的原生Javaweb项目的问题: 我们三层架构每一层之间的联系是这样的: 由GradeDao接口指向GradeDaoImpl 再由GradeService指向GradeServiceImpl 但是我们发现,如果这样写死在每一层的硬编码中的话,那么接口的存在就失去了意义 对象的创建是由这个上层的...