回答:
@Value
アノテーションを使用して、使用しているSpring Beanのプロパティにアクセスできます
@Value("${userBucket.path}")
private String userBucketPath;
Spring Bootドキュメントの外部化された構成セクションでは、必要になる可能性があるすべての詳細について説明しています。
@Configuration
クラスに基づく代替アプローチがあり、問題は次のブログ投稿
@Component
(またはその派生物、すなわち@Repository
、など)でのみ機能することに注意してください
別の方法はorg.springframework.core.env.Environment
、あなたの豆に注入することです。
@Autowired
private Environment env;
....
public void method() {
.....
String path = env.getProperty("userBucket.path");
.....
}
org.springframework.core.env.Environment
@ConfigurationProperties
値を.properties
(.yml
サポートされている)からPOJO にマップするために使用できます。
次のサンプルファイルについて考えてみます。
。プロパティ
cust.data.employee.name=Sachin
cust.data.employee.dept=Cricket
Employee.java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@ConfigurationProperties(prefix = "cust.data.employee")
@Configuration("employeeProperties")
public class Employee {
private String name;
private String dept;
//Getters and Setters go here
}
これで、employeeProperties
次のように自動配線によってプロパティ値にアクセスできます。
@Autowired
private Employee employeeProperties;
public void method() {
String employeeName = employeeProperties.getName();
String employeeDept = employeeProperties.getDept();
}
src/main/resources
Springテストからコードをテストしない場合は、ファイルを保存する必要があります。
現在、私は次の3つの方法について知っています。
1. @Value
注釈
@Value("${<property.name>}")
private static final <datatype> PROPERTY_NAME;
null
ます。たとえば、preConstruct()
メソッドまたはメソッドに設定しようとしたinit()
場合。これは、クラスが完全に構築された後に値の注入が行われるために発生します。これが、3番目のオプションを使用する方が良い理由です。2. @PropertySource
アノテーション
<pre>@PropertySource("classpath:application.properties")
//env is an Environment variable
env.getProperty(configKey);</pre>
PropertySouce
Environment
クラスが読み込まれるときに、プロパティソースファイルの値を(クラス内の)変数に設定します。したがって、あとがきで簡単にフェッチできます。
3. @ConfigurationProperties
注釈。
プロパティデータに基づいてエンティティを初期化します。
@ConfigurationProperties
ロードするプロパティファイルを識別します。@Configuration
構成ファイル変数に基づいてBeanを作成します。@ConfigurationProperties(prefix = "user") @Configuration( "ユーザーデータ") クラスユーザー{ //プロパティとそのゲッター/セッター } @Autowired プライベートUserData userData; userData.getPropertyName();
spring.config.location
か?#2はまだ機能しますか?
この方法でもできます...
@Component
@PropertySource("classpath:application.properties")
public class ConfigProperties {
@Autowired
private Environment env;
public String getConfigValue(String configKey){
return env.getProperty(configKey);
}
}
次に、application.propertiesから読み取りたい場所にキーをgetConfigValueメソッドに渡します。
@Autowired
ConfigProperties configProp;
// Read server.port from app.prop
String portNumber = configProp.getConfigValue("server.port");
Environment
?
spring.config.location
か?
この値を1か所で使用@Value
するapplication.properties
場合は、を使用してから変数をロードできますが、この変数をロードするためのより集中的な方法が必要な場合@ConfigurationProperties
は、より良いアプローチです。
さらに、検証とビジネスロジックを実行するために異なるデータ型が必要な場合は、変数をロードして自動的にキャストできます。
application.properties
custom-app.enable-mocks = false
@Value("${custom-app.enable-mocks}")
private boolean enableMocks;
次の手順を実行します。1:-以下のように構成クラスを作成します。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;
@Configuration
public class YourConfiguration{
// passing the key which you set in application.properties
@Value("${userBucket.path}")
private String userBucket;
// getting the value from that key which you set in application.properties
@Bean
public String getUserBucketPath() {
return userBucket;
}
}
2:-構成クラスがある場合、必要な構成から変数を挿入します。
@Component
public class YourService {
@Autowired
private String getUserBucketPath;
// now you have a value in getUserBucketPath varibale automatically.
}
アプリケーションは、application.propertiesファイルから3種類の値を読み取ることができます。
application.properties
my.name=kelly
my.dbConnection ={connection_srting:'http://localhost:...',username:'benz',password:'pwd'}
@Value("${my.name}")
private String name;
@Value("#{${my.dbConnection}}")
private Map<String,String> dbValues;
application.propertiesにプロパティがない場合は、デフォルト値を使用できます
@Value("${your_name : default value}")
private String msg;
Spring-bootを使用すると、外部化された構成を提供するいくつかの方法を使用できます。プロパティファイルの代わりにapplication.ymlまたはyamlファイルを使用して、異なる環境に応じて異なるプロパティファイルのセットアップを提供できます。
各環境のプロパティを別々のスプリングプロファイルの下の別々のymlファイルに分離できます。その後、展開中に次を使用できます。
java -jar -Drun.profiles=SpringProfileName
使用するスプリングプロファイルを指定します。ymlファイルは次のような名前にする必要があります。
application-{environmentName}.yml
それらがspringbootによって自動的に取得されるようにします。
リファレンス:https : //docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties
application.ymlまたはプロパティファイルから読み取るには:
最も簡単な方法は、プロパティファイルから値を読み取るためにか、YMLは、私たちが直接のような環境からこれらの値を使用できるように、春の@valueのannotation.Springが自動的にスプリング環境へYMLからすべての値をロードし使用することです:
@Component
public class MySampleBean {
@Value("${name}")
private String sampleName;
// ...
}
または、強く型付けされたBeanを読み取るためにSpringが提供する別の方法は次のとおりです。
YML
ymca:
remote-address: 192.168.1.1
security:
username: admin
ymlを読み取るための対応するPOJO:
@ConfigurationProperties("ymca")
public class YmcaProperties {
private InetAddress remoteAddress;
private final Security security = new Security();
public boolean isEnabled() { ... }
public void setEnabled(boolean enabled) { ... }
public InetAddress getRemoteAddress() { ... }
public void setRemoteAddress(InetAddress remoteAddress) { ... }
public Security getSecurity() { ... }
public static class Security {
private String username;
private String password;
public String getUsername() { ... }
public void setUsername(String username) { ... }
public String getPassword() { ... }
public void setPassword(String password) { ... }
}
}
上記の方法はymlファイルでうまく機能します。
リファレンス:https : //docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
私にとって、上記のどれも私のために直接機能しませんでした。私がしたことは次のとおりです:
@Rodrigo Villalba Zayasに加え
implements InitializingBean
て、クラスに追加し
てメソッドを実装しました
@Override
public void afterPropertiesSet() {
String path = env.getProperty("userBucket.path");
}
だからそれは次のようになります
import org.springframework.core.env.Environment;
public class xyz implements InitializingBean {
@Autowired
private Environment env;
private String path;
....
@Override
public void afterPropertiesSet() {
path = env.getProperty("userBucket.path");
}
public void method() {
System.out.println("Path: " + path);
}
}
プロパティ値を取得する最良の方法は、使用しています。
1. Valueアノテーションの使用
@Value("${property.key}")
private String propertyKeyVariable;
2.環境Beanの使用
@Autowired
private Environment env;
public String getValue() {
return env.getProperty("property.key");
}
public void display(){
System.out.println("# Value : "+getValue);
}
最善の方法は@Value
、オブジェクトに値を自動的に割り当てるアノテーションを使用することprivate Environment en
です。これにより、コードが削減され、ファイルのフィルタリングが容易になります。
2つの方法があります。
@Value
クラスで直接使用できます @Value("#{'${application yml field name}'}")
public String ymlField;
または
@Configuration
、あなたはあなたがすべてを追加できるクラスをきれいにすることができます@value
@Configuration
public class AppConfig {
@Value("#{'${application yml field name}'}")
public String ymlField;
}
Environment
または経由でそれらを入手することもできます@ConfigurationProperties