記事ディレクトリ
@ConfigurationProperties および @Value アノテーションは、構成ファイル内のプロパティー定義を取得し、それらを Java Bean またはプロパティーにバインドするために使用されます。
1.使いやすい
@Configuration
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
private String hostName;
private int port;
private String from;
// standard getters and setters
}
@ConfigurationProperties で最適に機能します同じプレフィックスを持つすべての階層属性これは、構成ファイル内の mail で始まる属性を POJO にバインドするために使用されます。@Configuration は、@Component や @Service などの他のアノテーションに置き換えることもできます。
Spring は、プロパティをバインドするためにいくつかの緩いルールを使用します。したがって、次のバリアントはすべてプロパティ hostName にバインドされます。
mail.hostName
mail.hostname
mail.host_name
mail.host-name
mail.HOST_NAME
構成ファイルの内容は次のようになります (application.properties)
#Simple properties
[email protected]
mail.port=9000
[email protected]
注: @Configuration アノテーションが追加されていない場合、
次のように、メイン クラスに @EnableConfigurationProperties アノテーションを追加して、プロパティを POJO にバインドする必要があります。
@SpringBootApplication
@EnableConfigurationProperties(ConfigProperties.class)
public class EnableConfigurationDemoApplication {
public static void main(String[] args) {
SpringApplication.run(EnableConfigurationDemoApplication.class, args);
}
}
2. @ConfigurationPropertiesScan アノテーションで使用する
Spring Boot 2.2 以降、Spring はクラスパスをスキャンして @ConfigurationProperties クラスを見つけて登録します。したがって、そのようなクラスに @Component (および @Configuration などの他のメタアノテーション) でアノテーションを付ける必要はなく、 @EnableConfigurationProperties を付けても必要ありません。
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
private String hostName;
private int port;
private String from;
// standard getters and setters
}
@SpringBootApplication によって有効化されたクラスパス スキャナーは、このクラスに @Component で注釈を付けていなくても、ConfigProperties クラスを検出しました。
さらに、 @ConfigurationPropertiesScan アノテーションを使用して、構成プロパティ クラスのカスタムの場所をスキャンできます。
@SpringBootApplication
@ConfigurationPropertiesScan("com.xxx.configurationproperties")
public class EnableConfigurationDemoApplication {
public static void main(String[] args) {
SpringApplication.run(EnableConfigurationDemoApplication.class, args);
}
}
3. ネストされたプロパティ
List、Map、およびクラスをプロパティにネストできます
//定义Credentials 类
public class Credentials {
private String authMethod;
private String username;
private String password;
// standard getters and setters
}
リスト、マップ、およびクラスを使用するように ConfigProperties クラスを更新する必要もあります。
@Configuration
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
private String host;
private int port;
private String from;
private List<String> defaultRecipients;
private Map<String, String> additionalHeaders;
private Credentials credentials;
// standard getters and setters
}
次のプロパティ ファイルは、すべてのフィールドを設定します。
#Simple properties
mail.hostname=mailer@mail.com
mail.port=9000
mail.from=mailer@mail.com
#List properties
mail.defaultRecipients[0]=admin@mail.com
mail.defaultRecipients[1]=owner@mail.com
#Map Properties
mail.additionalHeaders.redelivery=true
mail.additionalHeaders.secure=true
#Object properties
mail.credentials.username=john
mail.credentials.password=password
mail.credentials.authMethod=SHA1
4. @ConfigurationProperties を使用して、@Bean アノテーション付きメソッドに作用する
このメソッドは、制御できないサードパーティ コンポーネントへのバインドに非常に適しています。
#Item 类
public class Item {
private String name;
private int size;
// standard getters and setters
}
#将属性绑定到Item实例上
@Configuration
public class ConfigProperties {
@Bean
@ConfigurationProperties(prefix = "item")
public Item item() {
return new Item();
}
}
5. 不変の @ConfigurationProperties バインディング
Spring Boot 2.2 以降では、 @ConstructorBinding アノテーションを使用して構成プロパティをバインドできます。これは基本的に、@ConfigurationProperties でアノテーションが付けられたクラスが不変になる可能性があることを意味します。コンストラクターバインディングを使用するには、 @EnableConfigurationProperties または @ConfigurationPropertiesScan を使用して構成クラスを明示的に有効にする必要があることを強調することが重要です。
#ImmutableCredentials 类
@ConfigurationProperties(prefix = "mail.credentials")
@ConstructorBinding
public class ImmutableCredentials {
private final String authMethod;
private final String username;
private final String password;
public ImmutableCredentials(String authMethod, String username, String password) {
this.authMethod = authMethod;
this.username = username;
this.password = password;
}
public String getAuthMethod() {
return authMethod;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
}
セッターを提供せずにコンストラクターを介してパラメーターをバインドすると、プロパティの最終的な変更は不変のプロパティバインディングになります。
6. まとめ
上記の要約によると、 @ConfigurationProperties を使用するいくつかの方法を確認できます
。
@Configuration //可以换成@Component
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
private String hostName;
private int port;
private String from;
// standard getters and setters
}
方法 2:
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
private String hostName;
private int port;
private String from;
// standard getters and setters
}
@SpringBootApplication
@EnableConfigurationProperties(ConfigProperties.class)
public class EnableConfigurationDemoApplication {
public static void main(String[] args) {
SpringApplication.run(EnableConfigurationDemoApplication.class, args);
}
}
注: @Configuration アノテーションは指定されていません。@EnableConfigurationProperties アノテーションをスタートアップ クラスに追加する必要があります。
方法 3:
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
private String hostName;
private int port;
private String from;
// standard getters and setters
}
@SpringBootApplication
@ConfigurationPropertiesScan("com.baeldung.configurationproperties")
public class EnableConfigurationDemoApplication {
public static void main(String[] args) {
SpringApplication.run(EnableConfigurationDemoApplication.class, args);
}
}
ConfigProperties クラスが com.baeldung.configurationproperties の下にあると仮定すると、@ConfigurationProperties アノテーションを含むパッケージの下のクラスを直接スキャンします。
方法 4:
@Configuration
public class ConfigProperties {
@Bean
@ConfigurationProperties(prefix = "item")
public Item item() {
return new Item();
}
}
方法 5:
@ConfigurationProperties(prefix = "mail.credentials")
@ConstructorBinding
public class ConfigProperties {
private String hostName;
private int port;
private String from;
public ConfigProperties(String hostName, int port, String from) {
this.hostName = hostName;
this.port = port;
this.from = from;
}
// standard getters and setters
}
上記のコンストラクターパラメーターバインディングにより、 @EnableConfigurationProperties または @ConfigurationPropertiesScan を使用して構成クラスを明示的に有効にする必要もあります。