• SpringBoot 使用SpringEL表达式


    @Value

    此注解, 我们用的最多的是读取配置文件属性的:

    @Value("${database.dirverName}")
    String driverName;
    

    这里的@Value中的${...}代表占位符, 它会读取上下文的属性值装配到属性中, 这就是一个最简单的SpringEL表达式, 通过SpringEL可以拥有更强大的运算规则来更好的装配Bean.

    它能够调用方法, 例如, 我们记录一个Bean的初始化时间:

    @Value("#{T(System).currentTimeMillis()}")
    private Long initTime = null;
    

    注意, 这里采用的#{...}代表启用SpringEL表达式, 它将具有运算功能, T(...)代表的是引入类, System是java.lang.*包的类, 这是java默认加载的包, 因此可以省略不写全限定类名, 如果是其他包, 需要写出全限定类名才能引用类. currentTimeMillis是它的静态方法, 也就是调用了一次System.currentTimeMillis()方法来为这个属性赋值.

    此外还可以直接为属性赋值, 如下:

    // 赋值字符串
    @Value("#{'使用SpringEL赋值字符串'}")
    private String str = null;
    
    // 科学计数法赋值
    @Value("#{9.3E3}")
    private double d;
    
    // 赋值浮点数
    @Value("#{3.14}")
    private float pi;
    

    虽然这比较灵活, 但有时候我们还可能去获取其他Spring Bean的属性来给当前的Bean属性赋值, 例如:

    @Value("#{beanName.str}")
    private String otherBeanProp = null;
    

    注意, 这里的beanName是Spring Ioc容器中某个Bean的名称, str是Bean的属性, 代表引用对应的Bean的属性str赋值给当前属性.有时候, 我们还希望这个属性的字母赋值时候全部变为大写, 这时候就可以写成:

    @Value("#{beanName.str?.toUpperCase()}")
    private String otherBeanProp = null;
    

    再次注意这里的EL表达式, 这里引用的str后面跟着一个 ? , 这个符号?的含义是判断这个属性是否为空, 如果不为空才去执行后面的方法toUpperCase方法, 进而把属性变为大写, 赋值给当前属性.除此之外, 还可以使用SpringEL进行一定的运算, 如下:

    // 数学运算
    @Value("#{1+2}")
    private int run;
    
    // 浮点数比较运算
    @Value("#{beanName.pi==3.14f}")
    private bolean piFlag;
    
    // 字符串比较
    @Value("#{beanName.str eq 'Spring Boot'}")
    private boolean strFlag;
    
    // 字符换连接
    @Value("#{beanName.str + ' 连接字符串'}")
    private String strApp = null;
    
    // 三目运算
    @Value("#{beanName.d > 1000 ? '大于' : '小于'}")
    private String resultDesc = null;
    

    SpringEL能够支持的运算还有很多, 其中等值比较如果是数字的可以使用==比较, 如果是字符串的可以使用 eq 进行比较, 当然, EL的内容远远不止这些, 只是其他的EL表达式使用率没有这么高. 所以这里不再进一步讨论了.

  • 相关阅读:
    问题-[DelphiXE2]提示第三控件不存在
    问题-[DelphiXE2]编译程序体积大的问题
    问题-[delphi2007、2010]无法二次启动,报EditorLineEnds.ttr被占用,进程一直有bds.exe?
    问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”
    问题-[Delphi]通过Map文件查找内存地址出错代码所在行
    问题-[WIN8.132位系统]安装Win8.1 遇到无法升级.NET Framework 3.5.1
    问题-[DelphiXE7]新建的安桌模拟器运行程序闪退
    问题-[Delphi]用LoadLibrary加载DLL时返回0的错误
    问题-[Access]“无法打开工作组信息文件中的表 'MSysAccounts'”的问题的解决方法
    教程-Delphi 调用控制面板设置功能
  • 原文地址:https://www.cnblogs.com/no-celery/p/14918788.html
Copyright © 2020-2023  润新知