Spring高級配置の運転時に注入します.

6427 ワード

以前、Beanの属性値を設定した時は、ハードコードの形式を採用していました.例えば、BlankDiscを定義する場合:
@Bean
public BlankDisc blankDisc(){
    
    return new BlankDisc("This is BlankDisc", "The Beatles");
}
 
これに類似して、XMLを採用する方式もハードコードです.
     
ハードコードのデメリットはご存知のようですので、これらの値をプログラム実行時に確認してもらえますか?実はSpringはもう二つの方法で運転時に注入する機能を提供しています.
  • 属性プレースホルダ
  • Spring表現言語(SpEL)
  • 1.属性のプレースホルダを使って外部の値を注入します.
    @Autowired
    Environment env;
    
    public BlankDisc blanKDiscBean2(){
        return new BlankDisc(
                env.getProperty("disc.title"),
                env.getProperty("disc.artist"));
    }
    
    1.1 Springを深く学ぶEvironment
    Evironmentのget Property()方法は4つの重荷重方法があります.
  • String get Property
  • String get Property
  • T get Property
  • T get Property(String key,Class type,T default Value)
  • 前の2つの形態のget Property()方法はいずれもStringタイプの値を返します.後の2つの重み付け方法は、直接文字列に戻るのではなく、取得した値を指定されたタイプの値に変換します.例えば、接続池における接続全体の数を維持します.
    int connectionCount = env.getProperty("db.connoctionCount",Integer.class,30);
    
    get Property()を使って属性を取得する時、もしこの属性が定義されていないなら、彼が取得したのはnullです.このような状況を発生させたくないなら、get RequedProperty()方法を使うことができます.
    //      
    env.getRequiredProperty("disc.title"),
    env.getRequiredProperty("disc.artist"));
    
    disc.titleまたはdisc.arstが定義されていない場合は、Illagal StateExceptionの異常を投げます.ある属性が存在するかどうかを確認したいなら、contains Propertyを呼び出すことができます.
    boolean titleExists = env.containsProperty(“disc.title”);
    
    属性をクラスに解析したいなら、get PropertyAsplassを使用できます.
    Class blankDisc = env.getPropertyAsClass("disc.class",BlankDisc.class);
    
    属性関連の機能に加えて、Evironmentはどのprofileがアクティブな状態にあるかを確認する方法を提供しています.
  • String[]getActive Profiles():profileの名前をアクティブにする配列を返す.
  • String[]get Default Profile():デフォルトのprofile名の配列を返す.
  • bootlean accepts Prifile:もしenvironmentが所与のprofileをサポートしたらtrueに戻ります.
  • 1.2解析属性のプレースホルダ
    Spring組立において、プレースホルダの形式は「${...)」パッケージの属性名です.属性のプレースホルダを使って、XMLでtomcat接続プールのbeanの属性を解析します.
        
        
            
            
            
            
            
    
            
            
            
        
    
    プレースホルダを使うには、PropertySources Placeholder Configrer beanを配置する必要があります.
    @Bean
    public static PropertySourcesPlaceholderConfigurer placehoderConfigurer(){
        
        return new PropertySourcesPlaceholderConfigurer();
    }
    
    Xml構成で名前空間に使用する要素は、PropertySources PlaceholderConfigrer beanを生成することができます.
    
    
    2.Spring表現言語で構成する
    Spring 3はSpring表現(Spring Excpression Language,SpEL)を導入しており、彼は強力で簡潔な方法でbean属性とコンストラクタパラメータに値を組み立てることができます.この過程で使用される表現は実行時に計算されます.SpELの特性は以下の点があります.
  • は、beanのIDを使用してbean
  • を参照する.
  • 起動方法とアクセス先の属性
  • は、値を算術、関係、論理演算を行う
  • .
  • 正規表現マッチング
  • セット操作
  • 2.1 SpEl表現の例
    書式
    説明
    ヽoo{1}
    得られた値は1です
    皰{T(System).current TimeMillis()
    現在の時間のミリ秒値を取得します.T()の表現は、java.lang.Systemをjavaに対応するタイプとみなします.この方法で対応する静的方法を呼び出します.
    ヽoo{blankDisc.title}
    IDがblankDisc beanの属性値を取得します.
    皱{system Propertys['disc.title]]
    システムのプロパティをsystem Propertysオブジェクトで参照します.
    上のいくつかの基本的なSpElのサンプルだけです.後は重点的に紹介します.まずSpEL式を使ってbeanを組み立てる属性を見てみます.
    public BlankDisc(
                @Value("#{systemPropertys['disc.title']}") String title, 
                @Value("#{systemPropertys['disc.artist']}") String artist){
            this.title = title;
            this.artist = artist;
        }
    
    上記の例では@Valueコメントを使用して、注釈にSpEL表式を設定します.上でいくつかの簡単な例を学びました.SpEL表式解析で得られた値をbeanに注入する方法も学びました.Spel式サポートの基礎式を続けて勉強しましょう.
    2.2ワードの額面を表す
    SpEL文字数パターンを使用すると、整数、浮動小数点、String、Booleanタイプの値を表します.
    #{1}
    #{3.14159}
    #{9.87E4}
    #{'Hello'}
    #{false}
    
    2.3 bean属性と方法の導入
    SpELは、IDによって他のbean、beanの属性とbeanを導入する方法があります.
    #{blankDisc}
    #{blankDisc.title}
    #{blankDisc.sayHello()}
    
    方法の戻り値を処理しても良い場合は、戻り値タイプの属性または方法を直接呼び出し、sayHello()と仮定する.戻り値はStringタイプです.#{blankDisc.sayHello().toUpperCase()}で、戻り値の大文字形式が取得できます.しかし、戻り値がnullであれば、呼び出された方法は空の指針に異常があります.この場合を防ぐために使用できますか?戻り値がnullであるかどうかを判断します.SayHello()方法の戻り値がnullである場合、SpElはtopperCaseを呼び出しません.方法は、SpELの戻り値がnullです.
    2.4式でタイプを使う
    SpEL表現がクラスのスコープにアクセスする場合、T()という鍵となる演算子を使用します.#{blankDisc.sayHello()?.toUpperCase()}演算子の結果はクラスのオブジェクトで、java.lang.Mathを表します.Mathの静的方法と定数にアクセスできます.
    #{T(java.lang.Math).PI}
    #{T(java.lang.Math).random()}
    
    2.5 SpEL演算子
    SpELは複数の演算子を提供しています.これらの演算子はSpEL式に使用できます.
    演算子の種類
    演算子
    算術演算子
    +、-、*、/、%、^
    比較演算子
    、=、<=>=、lt、gt、eq、ge
    条件演算子
    ?:(ternary)、?:(Elvis)
    論理演算子
    and、or、not、
    正規表現
    matches
    2.6正規表現を計算する
    SpELは、matches演算子によって式中のモードマッチングをサポートしています.マッチングしたらtrueに戻ります.さもなければfalseに戻ります.メールボックスが正規表現に合っているかどうかを判断します.
    #{admin.email matches '[a-zA-Z0-9.-%+-]+@[a-zA-Z0-9.-]+\\.com'}
    
    2.7集合を計算する
    SpEL参照リストの要素の一つとして、#{T(java.lang.Math)}を使用して、リストの5番目の要素(0に基づいて開始)を取得します.[]は、集合または配列からインデックスに従って要素を抽出します.SpELは、クエリー演算子(.?[])を提供します.彼は、集合をフィルタリングし、集合のサブセットを得るために使用します.次に、Aerossmithの歌をフィルタリングします.
    #{jukebox.songs.?[artist eq 'Aerosmith']}
    
    .^[]クエリーの最初の一致項.$[]クエリの最後の一致項目
    投影演算子(.![])は、セットオブジェクトの特定のフィールドを別のセットに投影し、次のセットでは、曲の名前を他のStringタイプのセットに投影する.
    #{jukebox.songs.![title]}
    
    また、投影される曲をフィルタリングして、次はAerosithの曲のtitleを取得します.
    #{jukebox.songs.?[artist eq 'Aerosmith'.![title]]}
    
    これから運行する時に注いだ内容を全部紹介しました.やっと終わりました.来月からはSpringのAopメカニズムを勉強します.楽しみにしています.come on!