Spring入門(プロパティの外部化編)
はじめに
仕事でSpringを用いたバックエンド開発を行うことになったため、Springについての学習をゼロから開始した。
学んだ内容を概念ごとに分割して記事を作成する。
本記事の対象読者はプログラミングやアプリケーション構築の基礎知識はあるが、Springは未経験の方。
外部プロパティの設定
Springでは外部プロパティとして設定された値をEnvironment型のオブジェクトで管理される。
Environmentオブジェクトにプロパティの設定を行うには以下の4つの方法がある。
XXXX.propertiesファイルに値を設定して、
JavaConfigクラスに@PropertySourceアノテーションでプロパティファイルを指定する。application.propertiesファイルに値を設定する。
使用する値はapplication.{プロファイル名}.propertiesとすることで切り替えることができる。(プロファイルが指定されていない場合はapplication.default.propertiesファイルが使用される。)OSの環境変数に設定する。
システムプロパティ(Javaコマンドの-Dオプションで指定する)に設定する。
プロパティの設定を行なったEnvironmentオブジェクトはSpringにより自動でBeanとして管理される。
使用する際は@Autowiredでインジェクションして使用する。
@Autowired private Environment environment;
外部プロパティの使用
プログラム内で外部プロパティを使用するには以下の方法がある。
env.getProperty("プロパティ名")
Environmentオブジェクトに設定されている値を直接取得する方法。
最もベーシックな方法で、動的なプロパティ取得、複雑なロジックに使用する。
@Autowired
private Environment environment;
public void printProperty() {
String dbUrl = environment.getProperty("database.url");
System.out.println("Database URL: " + dbUrl);
}
@Value
プロパティ名を指定して値を取得する方法。
Beanメソッド、コンストラクタ、Setterメソッドの引数やクラスのフィールドに指定して使用することができる。
主にプロパティを直接フィールドにバインドするために使用する。
例:コンストラクタメソッド
@Autowired
public ProductServive(@Value("${MaxCount}") int maxCount) {
...
}
例:フィールド
@Value("${MaxCount}")
private int maxCount
@ConfigurationProperties
設定されているプロパティに同じプレフィックスの値が複数ある場合に、それらの値をクラス化してBeanとして管理する方法。
主に複数の関連する設定をまとめて扱う際に使用する。
例:プロパティファイル
db.mysql.host=example.com
db.mysql.user=testuser
db.mysql.password=password
例:クラス
@ConfigurationProperties(prefix="db.mysql")
@Component
public class Mysql {
private String host;
private String user;
private String password;
...Getter,Setterメソッド
}
例:Beanのインジェクション
@Service
public class ProductService {
private final Mysql mysql;
public ProductService(Mysql mysql) {
this.mysql = mysql;
}
public void test() {
String host = mysql.getHost();
...
}
}