zoukankan      html  css  js  c++  java
  • 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表达式使用率没有这么高. 所以这里不再进一步讨论了.

  • 相关阅读:
    OAuth 2 深入介绍
    浅谈 EF CORE 迁移和实例化的几种方式
    为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?
    三值 bool? 进行与或运算后的结果
    Slack 开发入门之 Incoming Webhooks:往 Slack 的 Channel 中发消息
    int? 竟然真的可以是 null!.NET/C# 确定可空值类型 Nullable 实例的真实类型
    .NET 中使用 Mutex 进行跨越进程边界的同步
    UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等)
    谨慎使用 FileInfo.Exists 实例方法,而是使用 File.Exists 静态方法替代
    只需 5 秒钟,你就能取到 WPF 程序的超高分辨率超高清截图
  • 原文地址:https://www.cnblogs.com/no-celery/p/14918788.html
Copyright © 2011-2022 走看看