🧑‍💻 Spring Framework 講座【第12回】設定を動的に!〜Spring Expression Language (SpEL) の活用〜

docs

前回までに、Spring Coreの主要な概念である DIIoCコンテナBeanの定義、そしてJava Configを学びました。これで、アプリケーションの骨格を組み立てる土台が完全に整いました。

今回は、Springが提供する強力な機能の一つである「SpEL (Spring Expression Language)」について学びます。SpELを使うと、Beanの定義や設定ファイルの値に**「動的な処理」「他のBeanの参照」**といった高度な設定が可能になります。

1. SpELとは?

SpEL (Spring Expression Language) は、Javaのプロパティや変数にアクセスしたり、簡単な計算を行ったり、他のBeanを参照したりするために設計された式言語です。

SpELは主に、@Value アノテーションの引数として利用されます。

1-1. SpELの基本的な記述形式

SpELは、シャープ記号と波括弧 (#{}**) の中に式を記述します。

Java

// 例:現在の日付の年を取得
# {T(java.time.LocalDate).now().getYear()}

ヒント: T() は、Javaのクラスを参照するためのSpELの特殊な演算子です。


2. SpELの主な活用例

2-1. プロパティ値の埋め込み(@Value)

最も一般的な使い方は、設定ファイル(application.propertiesなど)に記述された値をBeanのフィールドに注入することです。これは、SpELを使用しなくても可能ですが、SpELを使うことでより高度な制御ができます。

Properties

# application.properties
app.name=My Spring App
app.version=1.0.0

Java

@Component
public class AppInfo {

    // ① ${} を使って、プロパティファイルから値を直接注入
    @Value("${app.name}") 
    private String appName;

    // ② プロパティが存在しない場合のデフォルト値設定
    // ${} の中に「:」で区切ってデフォルト値を記述できる
    @Value("${app.server-port:8080}") 
    private int port;
    
    // ③ SpELの機能を使って、文字列を連結
    @Value("#{'${app.name}' + ' version ' + '${app.version}'}")
    private String fullVersion;

    // ... getter, setter
}

この例の fullVersion のように、プロパティの値を文字列として結合する際に # { } が役立ちます。

2-2. 他のBeanやメソッドの参照

SpELを使うと、IoCコンテナに登録されている他のBeanや、そのBeanのメソッドを直接参照できます。

例えば、AppInfo Beanがコンテナに登録されているとして、別の Service Beanでその値を使いたい場合を考えます。

Java

@Service
public class GreetingService {

    // Bean名 'appInfo' を指定し、そのプロパティ 'appName' を参照
    @Value("#{appInfo.appName}") 
    private String applicationName;
    
    // Bean名 'appInfo' のメソッド 'getFullVersion()' を実行して結果を取得
    @Value("#{appInfo.fullVersion}") 
    private String version;

    public String getGreeting() {
        return "ようこそ、" + applicationName + "へ! (Version: " + version + ")";
    }
}

2-3. リストや配列の作成

SpELでは、リストや配列を直接生成し、Beanに注入することも可能です。

Java

@Value("#{'Tokyo', 'Osaka', 'Nagoya'}")
private List<String> cityList; // リストとして注入される

2-4. 論理演算や条件分岐

式の中で、if-else のような条件演算子(三項演算子)や論理演算(and, or)を使用できます。

Java

// portが8080なら「Default」、それ以外なら「Custom」という文字列を注入
@Value("#{appInfo.port == 8080 ? 'Default' : 'Custom'}")
private String portType;

3. @Valueの使用箇所

@Value は、Beanのフィールドだけでなく、メソッドコンストラクタの引数にも適用できます。

【コンストラクタでの利用例】

コンストラクタで @Value を使うと、注入された値を final で宣言できるため、安全性が高まります。

Java

@Component
public class SecurityConfig {
    private final int connectionLimit;

    // コンストラクタの引数に @Value を適用
    public SecurityConfig(@Value("${app.max-connections:100}") int connectionLimit) {
        this.connectionLimit = connectionLimit;
    }
}

4. まとめ:SpELの活用による柔軟な設定

SpELは、単なる静的な値の注入を超えて、アプリケーションの設定に動的な要素Bean間の連携をもたらします。

特に、設定値によって動作を切り替えたり、特定のBeanのプロパティを複数の場所で再利用したりする際に、SpELはコードをシンプルかつ強力に保つのに役立ちます。

✅ 本日のまとめ

  • SpEL (Spring Expression Language) は、設定値やBeanの参照を動的に行うための式言語である。
  • SpELは主に @Value アノテーションの引数として、# { } の形式で記述する。
  • SpELにより、プロパティのデフォルト値設定、他のBeanのプロパティ参照(# {beanName.property})、メソッド呼び出し、簡単な論理演算などが可能になる。
  • @Value は、フィールド、メソッド、コンストラクタの引数に適用できる。

🔔 次回予告

これで、Spring Core(Springの土台となる部分)の知識は全て完了しました。

いよいよWebアプリケーション開発に進みます。現代のJava Web開発は Spring Boot なしには語れません。次回は、Spring Bootが生まれた背景と、開発効率を爆発的に高めるAuto-ConfigurationStarter POMsといった機能の全体像を把握します。

次回:【第13回】Spring Bootとは? にご期待ください!

コメント

タイトルとURLをコピーしました