Spring Bootのapplication.propertiesファイルで定義された値にアクセスする方法


312

で提供されている値にアクセスしたいapplication.properties。例:

logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR
logging.file=${HOME}/application.log

userBucket.path=${HOME}/bucket

userBucket.pathSpring Bootアプリケーションのメインプログラムでアクセスしたい。

回答:


467

@Valueアノテーションを使用して、使用しているSpring Beanのプロパティにアクセスできます

@Value("${userBucket.path}")
private String userBucketPath;

Spring Bootドキュメントの外部化された構成セクションでは、必要になる可能性があるすべての詳細について説明しています。


5
別の方法として、春Environmentまたは経由でそれらを入手することもできます@ConfigurationProperties
sodik

3
@ sodikの答えの上に追加するには、これはショーはどのように取得することの例である環境 stackoverflow.com/questions/28392231/...
クリスティ

10個を超える値にアクセスする必要がある場合はどうでしょうか。例を10回繰り返し続ける必要がありますか?
ジェシー

1つのアプローチはそうすることですが、その面倒です。@Configurationクラスに基づく代替アプローチがあり、問題は次のブログ投稿
Master Slave

2
これは、a @Component(またはその派生物、すなわち@Repository、など)でのみ機能することに注意してください
Janac Meena

211

別の方法はorg.springframework.core.env.Environment、あなたの豆に注入することです。

@Autowired
private Environment env;
....

public void method() {
    .....  
    String path = env.getProperty("userBucket.path");
    .....
}

6
アクセスする必要のあるプロパティの名前が動的に変更される場合にも役立ちます
Paulo Merson '28

3
プロパティを検索したい場合はどうなりますか?そして、すべての人が環境パッケージ名、おそらくorg.springframework.core.env.Environmentを確認できるようにimportステートメントを含めることをお勧めします
chrisinmtown

2
間違った環境をインポートしないように注意してください。CORBA環境を自動インポートしました。
Janac Meena

3
なぜ私の環境がnullなのですか?
Janac Meena

2
@JanacMeenaは、代わりにIntelliJがCORBAのクラスを自動インポートする同じ問題を抱えていましたorg.springframework.core.env.Environment
Rasshu

31

@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();

}

1
私はこの方法を使用してnullの戻り値を取得し、プロパティファイルをsrc / test / resourcesに、プロパティjavaクラス(プロパティ値が保存されている)をsrc / main / package / propertiesに配置しました。私は何が欠けていましたか?ありがとう
アフマドレオユダント

src/main/resourcesSpringテストからコードをテストしない場合は、ファイルを保存する必要があります。
JoBⅈN

@AhmadLeoYudantoと同じですが、それを変えることはできません
Dimitri Kopriwa

6

現在、私は次の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>
  • PropertySouceEnvironmentクラスが読み込まれるときに、プロパティソースファイルの値を(クラス内の)変数に設定します。したがって、あとがきで簡単にフェッチできます。
    • システム環境変数を介してアクセスできます。

3. @ConfigurationProperties注釈。

  • これは主に、Springプロジェクトで構成プロパティをロードするために使用されます。
  • プロパティデータに基づいてエンティティを初期化します。

    • @ConfigurationProperties ロードするプロパティファイルを識別します。
    • @Configuration 構成ファイル変数に基づいてBeanを作成します。
    @ConfigurationProperties(prefix = "user")
    @Configuration( "ユーザーデータ")
    クラスユーザー{
      //プロパティとそのゲッター/セッター
    }
    
    @Autowired
    プライベートUserData userData;
    
    userData.getPropertyName();

デフォルトの場所を上書きするとどうなりますspring.config.locationか?#2はまだ機能しますか?
bmauter

このような場合、優先順位が高くなります。私が知っているように、コマンドラインを使用してspring.config.locationを設定すると、優先順位が高くなるため、既存のものを上書きします。
Dhwanil Patel

5

この方法でもできます...

@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"); 

1
パッケージとはEnvironment
e-info128

1
それをここで見つけてください:org.springframework.core.env.Environment
lucifer

デフォルトの場所を上書きするとどうなりますspring.config.locationか?
bmauter

3

この値を1か所で使用@Valueするapplication.properties場合は、を使用してから変数をロードできますが、この変数をロードするためのより集中的な方法が必要な場合@ConfigurationPropertiesは、より良いアプローチです。

さらに、検証とビジネスロジックを実行するために異なるデータ型が必要な場合は、変数をロードして自動的にキャストできます。

application.properties
custom-app.enable-mocks = false

@Value("${custom-app.enable-mocks}")
private boolean enableMocks;

3

次の手順を実行します。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.
}

1
1.Injecting a property with the @Value annotation is straightforward:
@Value( "${jdbc.url}" )
private String jdbcUrl;

2. we can obtain the value of a property using the Environment API

@Autowired
private Environment env;
...
dataSource.setUrl(env.getProperty("jdbc.url"));

1

アプリケーションは、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; 

0

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


0

私にとって、上記のどれも私のために直接機能しませんでした。私がしたことは次のとおりです:

@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);
    }
}

0

プロパティ値を取得する最良の方法は、使用しています。

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);
}

0

最善の方法は@Value、オブジェクトに値を自動的に割り当てるアノテーションを使用することprivate Environment enです。これにより、コードが削減され、ファイルのフィルタリングが容易になります。


0

2つの方法があります。

  1. @Valueクラスで直接使用できます
    @Value("#{'${application yml field name}'}")
    public String ymlField;

または

  1. それをきれいにするために@Configuration、あなたはあなたがすべてを追加できるクラスをきれいにすることができます@value
@Configuration
public class AppConfig {

    @Value("#{'${application yml field name}'}")
    public String ymlField;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.