springのEL式

6725 ワード

springのEL式
        最初はこの章は何もいい話ではないと思っていましたが、仕事の中でも基礎的な機能を使っています.今日までこの部分を深く勉強してきましたが、実はspringのEL(expressing lagge)表現はどれほど強いですか?
        SpringのEL表現はSpELと略称され、ONL表現などの表現に似ています.springとは直接に独立しています.たとえば、文字列の解析を担当するインターフェース(ExpressitionParse).公式の例を見てみてください.
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'");
String message = (String) exp.getValue();
  公式宣言SpELは以下の機能をサポートしています.        1.    文字表現
        2.    算術演算子
        3.    正規表現
        4.    クラス
        5.    アクセス属性、配列、セット、およびMap
        6.    メソッドの呼び出し
        7.    関係演算子
        8.    ジョブ
        9.    呼び出し構造方法
        10.   関連するオブジェクト
        11.   配列を作成
        12.    インライン集合
        13.    インラインMap
        14.    三元クラウド演算子
        15.    変数
        16.    ユーザー定義方法
        17.    
集合投影
        18.    セット選択
        19.    テンプレートの表現
      もちろん、これは私達が重点的に注意する必要がある方法ではありません.
        1.    単純文字列注入
@Value("spring boot")
private String spring;
この方法は簡単で乱暴ですが、実用的な意味はないと思います.
        2.    システムのプロパティから取得し、注入します.
@Value("#{systemProperties['os.name']}")
private String osName;
出力はPCのオペレーティングシステム、例えばWindows 10であり、彼はシステムの属性値を取得することができる.
        3.    クラスの呼び出し方法
@Value("#{T(java.lang.Math).random() * 100}")
private double randomNumber;
出力はランダムな0~100のdouble値です.T()には呼び出しjavaのクラスを記入します.彼は直接算術演算子を使って値を計算できます.
        4.    クラスの属性を取得
まず簡単なPerson種類を書きます.
package com.yczuoxin.demo.config;

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

@Component
public class Person {

    @Value("zhangsan")
    private String pName;

    public String getpName() {
        return pName;
    }

    public void setpName(String pName) {
        this.pName = pName;
    }
}
そのpNameを取得します.
@Value("#{person.pName}")
private String pName;
出力の結果、私達が注入した「zhangsan」ですので、SpELは直接クラスの属性を取得できます.
注意:ここでPerson類のpName属性はプライベートですので、get方法を提供しなければなりません.そうでなければエラーが発生します.しかし、pNameが共有方法であれば、get方法を提供する必要がなくても値を取得できます.
        5.    チェーンコールの方法
それともPersonクラスでテストしますか?
@Value("#{person.getpName().toUpperCase()}")
private String pName;
このとき私たちが出力した結果は、「ZHANGSAN」です.StringのtoUpperCaseを成功的に起動しました.この時、慎重な思考をしている友達がきっと聞いてくれます.もし獲得した値がnullだったら、空のポインターですか?そうです.もしnullだったらorg.springframe ewark.beans.factory.Unisatis fied DependencyExceptionの異常を投げますが、どうやって避けるべきですか?次のようなところに「?」をつけるだけで解決できます.
@Value("#{person.getpName()?.toUpperCase()}")
private String pName;
?号の役割は、メソッドを呼び出す前に、先に結果がnull値であるかどうかを判断し、もしそうでなければ、直接nullに戻ります.
        6.    算術演算
@Value("#{(1+2)>3}")
public boolean count;
出力結果はfalseで、SpELは算術演算に対応すると説明しています.
        7.    三項演算子
@Value("#{(1+2)>3 ? 'yes' : 'no'}")
public String count;
出力結果はNOで、SpELは3元演算に対応すると説明しています.
        8.    elvis演算子(値があれば出力値、nullであればデフォルト値が出力されます)は、依然としてPerson類で注釈@Valueを削除します.
@Value("#{person.getpName()?:'zhangsan'}")
private String pName;
出力結果はzhangsanで、SpEL対応elvis演算子を説明します.
        9.    集合タイプの運用
       Personクラスを先に書き換えて、その中にage属性を加えて、再びtoString方法を直して、無参構造と有参構造があります.
package com.yczuoxin.demo.config;

import org.springframework.stereotype.Component;

@Component
public class Person {

    public Person() {
    }

    public Person(String pName, int age) {
        this.pName = pName;
        this.age = age;
    }

    private String pName;
    private int age;

    public void setpName(String pName) {
        this.pName = pName;
    }

    public String getpName() {
        return pName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
そしてテストbeanに参加します.
package com.yczuoxin.demo.config;

import org.springframework.stereotype.Component;

import java.util.*;

@Component
public class TestBean {

    public List list = Arrays.asList(new Person("zhangsan",19),new Person("lisi",19), new Person("wangwu",20));
    public Map map;

    public TestBean(){

        map = new HashMap<>();
        map.put("key1","value1");
        map.put("key2","value2");
        map.put("key3","value3");
    }
}
                   a.    クエリーセットの下に2と表示される要素
@Value("#{testBean.list[2]}")
private Person person;
Person{pName='wangwu', age=20}
                     見えるSpELは、リストの下の2つのオブジェクトを取り出した.
@Value("#{testBean.map[key1]}")
private String value;
value1
                        Mapでは、取り出したMapはkeyの値に対応する.
                b.    クエリーセットの値に対応するオブジェクト
@Value("#{testBean.list.?[age==19]}")
private List person;
[Person{pName='zhangsan', age=19}, Person{pName='lisi', age=19}]
                    SpELは、ageを19の対象として取り出しました.listを持って受信しないと、エラーが発生します.はすべてのクエリです.
                最後の条件を満たすものを検索します.
                c.    集合投影
@Value("#{testBean.list.![pName]}")
private List pNames;
[zhangsan, lisi, wangwu]
                     SpEL使用集合投影を行い、Person集合中のpName属性を持ち出し、新たな集合の中に閉じ込める.
 
       最もよく使われているプロファイルの内容を取得する方法を忘れました.ここで補足します.
設定ファイル
book.name = spring boot
@Value("${book.name}")
private String normal;
spring boot
何の結果ですか?配置類に注釈を加える必要があるので、これは簡単でよく使われています.詳しくは言いません.
package com.yczuoxin.demo.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration
@PropertySource("classpath:test.properties")
public class Beans {

    @Value("${book.name}")
    public String name;

    public void print(){
        System.out.println(name);
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){
        return new PropertySourcesPlaceholderConfigurer();
    }
}
       ここにメモしておきます.SpELの機能がとても強いと感じていますか?ただ仕事中に彼を使うとは思わなかったです.だからここでメモを作ります.プロジェクトで使えるかもしれません.見たところ、背が高くなります.