共通ライブラリの設定を自動読み込みする方法を調べたので忘れないようにメモ。
環境
- Spring Boot 3.5.4
- Java 21
まず@ConfigurationPropertiesクラスを用意する
Spring Boot ではapplication.ymlや環境変数などの設定値を型安全にまとめて扱うため@ConfigurationPropertiesを使えます。
user:
user-id: ${USER_ID:admin}
user-name: ${USER_NAME:hoge}
@Data
@ConfigurationProperties(prefix="user")
public class UserConfig {
// ユーザーID
private String userId;
// ユーザー名
private String userName;
}
Service クラスでの利用例
UserConfigがBean登録されていれば、以下のようにDIして使えます。
@Service
@RequiredArgsConstructor
public class TestService {
private final UserConfig userConfig;
public void testMethod() {
userConfig.getUserId();
userConfig.getUserName();
}
}
@ConfigurationPropertiesScanを使った方法
下記のようにアプリケーションクラスに @ConfigurationPropertiesScanを追加すると共通化した別パッケージを参照することができます。
package project.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
@SpringBootApplication
@ConfigurationPropertiesScan(basePackages = {
"project.test",
"project.common.config"
})
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
@AutoConfigurationのimportファイルを使った方法
@ConfigurationPropertiesScanを使った方法でもいいのですが、新規システムが増えるたびに宣言するのは面倒です。
別の方法はないかと調べたところMETA-INF配下にAutoConfigurationのimportsファイルを作成すると@ConfigurationPropertiesScanを書く必要がなくなるとのことです。
手順
1. 自動設定クラスを作成
まずは下記のように@AutoConfigurationクラスを作成します。
package project.common.config;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@AutoConfiguration
@EnableConfigurationProperties(UserConfig.class)
public class CommonAutoConfiguration {
}
2. importsファイルを作成
次に以下の場所にファイルを作成します。
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
importsファイルの中身を下記のようにします。
project.common.config.CommonAutoConfiguration
これで、アプリケーションに@ConfigurationPropertiesScanを書かなくても自動的に設定が有効になります。
複数クラスを指定したい場合
@ConfigurationPropertiesクラスが複数存在する場合は@EnableConfigurationPropertiesに下記のように指定することができます。
@AutoConfiguration
@EnableConfigurationProperties({
UserConfig.class,
HogeAConfig.class,
HogeBConfig.class
})
public class CommonAutoConfiguration {
}
importsファイルにはパッケージ全体を指定することはできず、クラス単位で指定する必要があります。
# これは指定できない ✕
project.common.config.*
# クラス単位で指定する ○
project.common.config.CommonAutoConfiguration
AutoConfigurationクラス側でまとめておくことで、importファイルは1行で済み、管理もしやすくなります。