java获取spring配置文件_Spring读取配置文件 @Value

2023-03-28 15:05:35

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

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

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

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

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

第一种思路

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

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

方案a:

bf160cf2226e863413bebf63f4e48a76.png

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

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

方案b:

e8355314bb4b5580d172b3e3d7a4437e.png

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

方案c:

fafb31e3dea889bd3b2007345984dfe8.png

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

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

628165068bf56263d8fb413d21b14e8b.png

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

20b9c64d0e310b2ba8738d92e7d08e47.png

方式二.  假如项目中的bean是用的注解(我知道的四个 @controller、@service、@component、@repository),没有在xml配置文件中定义;

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

a4046d3ed3d7e456dc0792324043efdb.png

step2

需要标签开始包扫描,使用注解方式的bean,这样才会扫描到@value注解

2c3fe7b3f34b934ff000286b45c3ad74.png

82663a6a4c6eeeb3b54d8fdeefe599fb.png  value注解可以标注在属性上,也可以标注在set方法上;

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

第二种思路  spel表达式

#{}形式为springel表达式,简称spel, 详细的博客见作者链接 :

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

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

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

1e01ed9ed4f129f57c8beaf9cb6f51d5.png

step2.开启@component、@service等注解,以及最重要的@value注解开启使用; @value注解开启是依赖于注册了autowiredannotationbeanpostprocessor这个beanpostprocessor,而就

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

config.properties文件如下:

03acae25e1abbeefc2640995550665d8.png

spel使用方式如下:

59b56899777dadb2c63e8f1c22658446.png

81ec5528bde88a977ef4448fe6776306.png

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

此外系统jvm的参数,即system.getproperties()的参数可以直接el表达式使用; #{systemproperties['属性名']}

8e3c9ca0029e65184e1cfbd11f4893cc.png

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

110b64277c5430484ffd7f2df00a7e65.png

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

再次附上介绍spel的链接,

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

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

35ea023564dbf0256236a3e7894aff69.png

jvm参数:

32946f52158c77cf02aaa951918d42c8.png

希望与广大网友互动??

点此进行留言吧!

  • 作者:编号0218
  • 原文链接:https://blog.csdn.net/weixin_33362096/article/details/114302583
    更新时间:2023-03-28 15:05:35