前回までに、Spring Coreの主要な概念である DI、IoCコンテナ、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-ConfigurationやStarter POMsといった機能の全体像を把握します。
次回:【第13回】Spring Bootとは? にご期待ください!


コメント