最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot SpringEL表達(dá)式的使用

 更新時間:2021年07月25日 10:53:24   作者:TianXinCoord  
本文主要介紹了SpringEL表達(dá)式的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、SpringEL-基礎(chǔ)介紹

什么是SpringEL(SpEL)?

  • Spring3中引入了Spring表達(dá)式語言—SpringEL,SpEL是一種強(qiáng)大,簡潔的裝配Bean的方式
  • SpringEL可以通過運(yùn)行期間執(zhí)行的表達(dá)式將值裝配到我們的屬性或構(gòu)造函數(shù)當(dāng)中
  • SpringEL可以調(diào)用JDK中提供的靜態(tài)常量,獲取外部Properties文件中的的配置

為什么要使用SpringEL?

  • 平常通過配置文件或Annotaton注入的Bean,其實都可以稱為靜態(tài)性注入
  • 如Bean A中有變量A,它的值需要根據(jù)Bean B的B變量為參考,在這場景下靜態(tài)注入就對這樣的處理顯得非常無力
  • 而Spring3增加的SpringEL就可以完全滿足這種需求,而且還可以對不同Bean的字段進(jìn)行計算再進(jìn)行賦值,功能非常強(qiáng)大

如何使用SpringEL?

  • SpringEL從名字來看就能看出和EL是有點關(guān)系的,SpringEL的使用和EL表達(dá)式的使用非常相似
  • EL表達(dá)式在JSP頁面更方便的獲取后臺中的值,而SpringEL就是為了更方便獲取Spring容器中的Bean的值
  • EL使用${},而SpringEL使用#{}進(jìn)行表達(dá)式的聲明

兩者主要區(qū)別

  • $是去找外部配置的參數(shù),將值賦過來
  • #是SpEL表達(dá)式,去尋找對應(yīng)變量的內(nèi)容
  • 也可以直接使用@value("常量")注入不使用EL,這樣寫法與直接賦值等價

如果是在Spring中使用可以使用**@PropertySource("classpath:my.properties")**加載對應(yīng)配置文件

二、EL表達(dá)式-基礎(chǔ)使用

# 配置文件
com:
  codecoord:
    el:
      num: 1001
      name: el
      language:
        - java
        - spring
        - mysql
        - linux
      # 逗號分隔可以注入列表
      language02: java,spring,mysql,linux

使用EL注入簡單值

/**
 * 注入簡單值,直接注入不使用EL,EL不支持直接指定常量
 * 直接在EL中指定的常量會當(dāng)做配置處理,和直接賦值等價
 */
@Value("1432516744")
private Integer no;

注入配置文件屬性值

/**
 * 注入整型屬性值
 */
@Value("${com.codecoord.el.num}")
private Integer num;
/**
 * 注入字符屬性值
 */
@Value("${com.codecoord.el.name}")
private String name;

注入默認(rèn)值

/**
 * 注入字符不存在屬性值并指定默認(rèn)值,默認(rèn)值使用過冒號分隔 :
 * 注入常量其實就可以指定一個不存在的配置然后使用默認(rèn)值,此處skill的值為java
 */
@Value("${com.codecoord.el.skill:java}")
private String skill;

注入列表

  • 不支持直接配置文件中數(shù)組語法格式注入列表
  • 可以識別使用逗號,分隔的配置,spring默認(rèn)以,分隔
// 錯誤寫法:不支持直接注入yml列表格式語法列表
@Value("${com.codecoord.el.language}")
private List<String> listLanguage;
@Value("${com.codecoord.el.language}")
private String[] strLanguage;
/**
 * 支持,分隔的注入列表
 */
@Value("${com.codecoord.el.language02}")
private List<String> listLanguage02;
@Value("${com.codecoord.el.language02}")
private String[] strLanguage02;

完整參考如下

配置文件

server:
  port: 8888
com:
  codecoord:
    el:
      num: 1001
      name: el
      language:
        - java
        - spring
        - mysql
        - linux
      # 逗號分隔可以注入列表
      language02: java,spring,mysql,linux

屬性配置類

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.List;

@Data
@Component
public class ElConfig {
    /**
     * 注入簡單值,直接注入不使用EL,EL不支持直接指定常量
     * 直接在EL中指定的常量會當(dāng)做配置處理,和直接賦值等價
     */
    @Value("1432516744")
    private Integer no;
    /**
     * 注入整型屬性值
     */
    @Value("${com.codecoord.el.num}")
    private Integer num;
    /**
     * 注入字符屬性值
     */
    @Value("${com.codecoord.el.name}")
    private String name;
    /**
     * 注入字符不存在屬性值并指定默認(rèn)值,默認(rèn)值使用過冒號分隔 :
     * 注入常量其實就可以指定一個不存在的配置然后使用默認(rèn)值,此處skill的值為java
     */
    @Value("${com.codecoord.el.skill:java}")
    private String skill;
    /// 不支持直接注入列表
    /*@Value("${com.codecoord.el.language}")
    private List<String> listLanguage;
    @Value("${com.codecoord.el.language}")
    private String[] strLanguage;*/
    /**
     * 支持,分隔的注入列表
     */
    @Value("${com.codecoord.el.language02}")
    private List<String> listLanguage02;
    @Value("${com.codecoord.el.language02}")
    private String[] strLanguage02;
}

向controller中注入配置類,然后訪問接口測試結(jié)果如下

{
 "no": 1432516744,
 "num": 1001,
 "name": "el",
 "skill": "java",
 "listLanguage02": [
  "java",
  "spring",
  "mysql",
  "linux"
 ],
 "strLanguage02": [
  "java",
  "spring",
  "mysql",
  "linux"
 ]
}

三、SpringEL-基礎(chǔ)使用

1、使用SpEL注入簡單值和普通EL注入使用基本一致
2、SpEl注入map

  • 配置文件中需要使用雙引號括起來,否則將會注入失敗,key為單引號
# SpEl
spEl:
  mapInject: "{'name': 'SpEl', 'website': 'http://www.codeocord.com'}"

java類中先使用${spEl.mapInject}注入字符串值,#{}會解析字符串的值轉(zhuǎn)為map

@Value("#{${spEl.mapInject}}")
private Map<String, String> mapInject;

3、SpEl注入list

  • 除了可以通過EL注入listI外,也可以使用#{${}.split('分隔符')}的方式注入List
  • 配置文件中例如使用#分隔
spEl:
  listInject: "44#11#99#100"

java類中先使用${spEl.listInject}注入字符串值,內(nèi)容使用單引號括起來,然后對字符串使用split方法分隔
提示:避免為空情況,可以給一個默認(rèn)值空串

@Value("#{'${spEl.listInject:}'.split('#')}")
 private List<String> listInject;

4、動態(tài)注入

上述注入都是靜態(tài)注入,SpEl支持從Spring容器中注入信息,稱為動態(tài)注入。動態(tài)注入類如下 

import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
@Data
public class SpElConstant {
    private String name = "SpElConstant-name";
    private String nickname = "tianxin";
    private int num = 100;
    private List<String> product = new ArrayList<String>() {{
        add("huaweiMate30Pro");
        add("xiaomi10x5g");
    }};
    private Map<String, String> productMap = new HashMap<String, String>() {{
        put("huaweiMate30Pro", "5999");
        put("xiaomi10x5g", "4999");
    }};
    private List<City> cityList = new ArrayList<City>() {{
        add(new City("深圳", 1000L));
        add(new City("杭州", 2000L));
        add(new City("貴陽", 900L));
    }};

    public String showProperty() {
        return "showProperty-無參數(shù)";
    }

    public String showProperty(String name) {
        return "showProperty-" + name;
    }

    @Data
    @AllArgsConstructor
    static class City {
        private String name;
        private long population;
    }
}

SpEl支持和不支持操作

  • 支持動態(tài)注入實例,類似于對象自動注入
  • SPL不支持直接注入配置文件中的配置
  • 支持調(diào)用靜態(tài)和實例方法
    • 靜態(tài)方法:@Value("#{T(package.ClassName).ConstFieldName")
  • 支持調(diào)用靜態(tài)類或常量
  • 支持運(yùn)算符運(yùn)算
  • 支持操作集合
  • 支持查詢篩選集合和投影

注入完整操作如下

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Data
@Component
public class SpElConfig {
    /// 不支持直接注入配置文件值
    /*@Value("#{com.codecoord.el.num}")
    private Integer num;*/
    /**
     * 對象注入
     */
    @Value("#{spElConstant}")
    private SpElConstant spElConstant;
    /**
     * 注入ID為spElConstant Bean中的STR常量/變量
     */
    @Value("#{spElConstant.name}")
    private String name;
    /**
     * 調(diào)用無參方法
     */
    @Value("#{spElConstant.showProperty()}")
    private String method1;
    /**
     * 有參接收字符串的方法
     */
    @Value("#{spElConstant.showProperty('Hell SpringEL')}")
    private String method2;
    /**
     * 方法返回的String為大寫
     */
    @Value("#{spElConstant.showProperty().toUpperCase()}")
    private String method3;
    /**
     * 若使用method3這種方式,若果showProperty返回為null
     * 將會拋出NullPointerException,可以使用以下方式避免
     * 使用?.符號代表若然左邊的值為null,將不執(zhí)行右邊方法
     */
    @Value("#{spElConstant.showProperty()?.toUpperCase()}")
    private String method4;
    /**
     * 注入math常量
     */
    @Value("#{T(java.lang.Math).PI}")
    private double pi;
    /**
     * 用random方法獲取返回值
     */
    @Value("#{T(java.lang.Math).random()}")
    private double random;
    /**
     * 獲取文件路徑符號
     */
    @Value("#{T(java.io.File).separator}")
    private String separator;
    /**
     * 拼接字符串
     */
    @Value("#{spElConstant.nickname + ' ' + spElConstant.name}")
    private String concatString;
    /**
     * 對數(shù)字類型進(jìn)行運(yùn)算,spElConstant擁有num屬性
     */
    @Value("#{3 * T(java.lang.Math).PI + spElConstant.num}")
    private double operation;
    /**
     * 進(jìn)行邏輯運(yùn)算
     */
    @Value("#{spElConstant.num > 100 and spElConstant.num <= 200}")
    private boolean logicOperation;
    /**
     * 進(jìn)行或非邏輯操作
     */
    @Value("#{not (spElConstant.num == 100) or spElConstant.num <= 200}")
    private boolean logicOperation2;
    /**
     * 使用三元運(yùn)算符
     */
    @Value("#{spElConstant.num > 100 ? spElConstant.num : spElConstant.num + 100}")
    private Integer logicOperation3;
    /**
     * 獲取下標(biāo)為0的元素
     */
    @Value("#{spElConstant.product[0]}")
    private String str;
    /**
     * 獲取下標(biāo)為0元素的大寫形式
     */
    @Value("#{spElConstant.product[0]?.toUpperCase()}")
    private String upperStr;
    /**
     * 獲取map中key為hello的value
     */
    @Value("#{spElConstant.productMap['hello']}")
    private String mapValue;
    /**
     * 根據(jù)product下標(biāo)為0元素作為key獲取testMap的value
     */
    @Value("#{spElConstant.productMap[spElConstant.product[0]]}")
    private String mapStrByproduct;
    /**
     * 注入人口大于等于1000人口的城市
     */
    @Value("#{spElConstant.cityList.?[population >= 1000]}")
    private List<SpElConstant.City> cityList;
    /**
     * 注入人口等于900人口的城市
     */
    @Value("#{spElConstant.cityList.?[population == 900]}")
    private SpElConstant.City city;
    /**
     * 注入人口大于等于1000人口的城市,且只保留城市名稱
     */
    @Value("#{spElConstant.cityList.?[population >= 1000].![name]}")
    private List<String> cityName;
}

注入結(jié)果

{
 "spElConstant": {
  "name": "SpElConstant-name",
  "nickname": "tianxin",
  "num": 100,
  "product": [
   "huaweiMate30Pro",
   "xiaomi10x5g"
  ],
  "productMap": {
   "xiaomi10x5g": "4999",
   "huaweiMate30Pro": "5999"
  },
  "cityList": [
   {
    "name": "深圳",
    "population": 1000
   },
   {
    "name": "杭州",
    "population": 2000
   },
   {
    "name": "貴陽",
    "population": 900
   }
  ]
 },
 "name": "SpElConstant-name",
 "method1": "showProperty-無參數(shù)",
 "method2": "showProperty-Hell SpringEL",
 "method3": "SHOWPROPERTY-無參數(shù)",
 "method4": "SHOWPROPERTY-無參數(shù)",
 "pi": 3.141592653589793,
 "random": 0.19997238292235787,
 "separator": "\\",
 "concatString": "tianxin SpElConstant-name",
 "operation": 109.42477796076938,
 "logicOperation": false,
 "logicOperation2": true,
 "logicOperation3": 200,
 "str": "huaweiMate30Pro",
 "upperStr": "HUAWEIMATE30PRO",
 "mapValue": null,
 "mapStrByproduct": "5999",
 "cityList": [
  {
   "name": "深圳",
   "population": 1000
  },
  {
   "name": "杭州",
   "population": 2000
  }
 ],
 "city": {
  "name": "貴陽",
  "population": 900
 },
 "cityName": [
  "深圳",
  "杭州"
 ]
}

Spring操作外部Properties文件

<!-- 首先通過applicaContext.xml中<util:properties>增加properties文件 -->
<!-- 注意需要引入Spring的util schemea命名空間和注意id屬性,id屬性將在SpringEL中使用 -->
<util:properties id="db" location="classpath:application.properties"/>

public class TestSpringEL {
 // 注意db為xml文件中聲明的id
 @Value("#{db['jdbc.url']}")
 private String propertiesValue;
}

SpringEL在使用時僅僅是一個字符串,不易于排錯與測試,也沒有IDE檢查我們的語法,當(dāng)出現(xiàn)錯誤時較難檢測,復(fù)雜的表達(dá)式不建議通過SpringEL方式注入。在非必要情況下,不推薦使用SpEl的復(fù)雜注入,清晰可讀的代碼更為重要且有利于排查問題

四、屬性自動注入

上述都是通過指定字段進(jìn)行注入,可以通過@ConfigurationProperties指定前綴進(jìn)行自動注入

org.springframework.boot.context.properties.ConfigurationProperties

配置類

user:
  id: ${random.uuid}
  name: autowire
  address: unknown
  website: www.codecoord.com
  age: ${random.int}

自動屬性注入類

  • 通過prefix指定前端為user,然后將會把user.后的類型按照名稱進(jìn)行注入
  • 注意必須要提供setter方法
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "user")
@Data
public class UserConfig {
    private String id;
    private String name;
    private String address;
    private String website;
    private Integer age;
}

可以通過@EnableConfigurationProperties(value = UserConfig.class)將UserConfig再次強(qiáng)制注入,問題出現(xiàn)在如果UserConfig為第三方j(luò)ar包內(nèi)的配置類,則可能出現(xiàn)屬性沒有注入情況,所以可以指定注入

到此這篇關(guān)于SpringBoot SpringEL表達(dá)式的使用的文章就介紹到這了,更多相關(guān)SpringEL表達(dá)式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解在Spring Boot中使用Https

    詳解在Spring Boot中使用Https

    本篇文章主要介紹了詳解在Spring Boot中使用Https,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 帶你粗略了解Java數(shù)組的使用

    帶你粗略了解Java數(shù)組的使用

    這篇文章主要給大家介紹了關(guān)于Java中數(shù)組的定義和使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • Spring MVC 攔截器 interceptor 用法詳解

    Spring MVC 攔截器 interceptor 用法詳解

    這篇文章主要介紹了Spring MVC 攔截器 interceptor 用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 使用Spring Security集成手機(jī)驗證碼登錄功能實現(xiàn)

    使用Spring Security集成手機(jī)驗證碼登錄功能實現(xiàn)

    本文詳細(xì)介紹了如何利用SpringSecurity來實現(xiàn)手機(jī)驗證碼的注冊和登錄功能,在登錄過程中,同樣需通過驗證碼進(jìn)行驗證,文章還提供了相關(guān)的代碼實現(xiàn)
    2024-10-10
  • zuulGateway 通過filter統(tǒng)一修改返回值的操作

    zuulGateway 通過filter統(tǒng)一修改返回值的操作

    這篇文章主要介紹了zuulGateway 通過filter統(tǒng)一修改返回值的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • java多線程編程之使用Synchronized塊同步方法

    java多線程編程之使用Synchronized塊同步方法

    synchronized塊來同步一個對象變量,也可以使用synchronized塊來同步類中的靜態(tài)方法和非靜態(tài)方法,下面使用Synchronized塊同步方法
    2014-01-01
  • 使用spring-cache一行代碼解決緩存擊穿問題

    使用spring-cache一行代碼解決緩存擊穿問題

    本文主要介紹了使用spring-cache一行代碼解決緩存擊穿問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java TreeMap升序|降序排列和按照value進(jìn)行排序的案例

    Java TreeMap升序|降序排列和按照value進(jìn)行排序的案例

    這篇文章主要介紹了Java TreeMap升序|降序排列和按照value進(jìn)行排序的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • springboot更新配置Swagger3的一些小技巧

    springboot更新配置Swagger3的一些小技巧

    今天給大家分享springboot更新配置Swagger3的方法,大家需要注意Swagger3版本需要引入依賴,具體示例代碼參考下本文
    2021-07-07
  • 基于java時區(qū)轉(zhuǎn)換夏令時的問題及解決方法

    基于java時區(qū)轉(zhuǎn)換夏令時的問題及解決方法

    下面小編就為大家分享一篇基于java時區(qū)轉(zhuǎn)換夏令時的問題及解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11

最新評論

高清| 虹口区| 湖口县| 新沂市| 彭阳县| 江达县| 伊春市| 新宁县| 同仁县| 威信县| 金秀| 上饶市| 淳安县| 永安市| 东城区| 贵阳市| 定远县| 南和县| 勐海县| 克山县| 长顺县| 灵川县| 兰坪| 石门县| 连山| 仲巴县| 浦城县| 黔江区| 玛沁县| 邢台县| 东辽县| 永康市| 肥城市| 深圳市| 察哈| 临颍县| 郁南县| 屯昌县| 革吉县| 临漳县| 交城县|