• 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参数:

     

  • 相关阅读:
    qt运行时连接signal和slot
    linux使用usb转串口调试ARM开发板
    qwt自定义时间标尺TimeScale
    关于mysql 导入大型数据问题的解决(转载,出处以忘)
    JavaScript replace(RegExp, Function)详解
    有关高度和宽度的对象
    前自增和后自增(chrome js 为了保险,还没测过其它的)
    JavaScript效率PK——统计特定字符在字符串中出现的次数
    getStyle函数
    解决CHM文件在WIN7下崩溃和自动生成CHW文件的问题
  • 原文地址:https://www.cnblogs.com/lvbinbin2yujie/p/10274663.html
Copyright © 2020-2023  润新知