Spring Boot'daki application.properties dosyasında tanımlanan bir değere nasıl erişilir


312

Sağlanan değerlere erişmek istiyorum application.properties, örneğin:

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

userBucket.path=${HOME}/bucket

userBucket.pathBir Spring Boot uygulamasında ana programıma erişmek istiyorum .

Yanıtlar:


467

@ValueEk açıklamayı kullanabilir ve hangi Bahar fasulyesini kullanırsanız kullanabilirsiniz.

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

Externalized Yapılandırma Bahar Önyükleme dokümanlar bölümünde, ihtiyaç duyacağı bütün ayrıntıları açıklar.


5
Alternatif biri tr olarak kaynaktan da aldırabilirler Environmentveya üzeri@ConfigurationProperties
sodik

3
@ Sodik'in cevabının üstüne eklemek için, bu Ortam nasıl elde edileceğini gösteren bir örnektir stackoverflow.com/questions/28392231/…
cristi

10'dan fazla değere erişmeniz gerekiyorsa, örnek 10 kez tekrarlamaya devam etmek ister misiniz?
Jesse

bir yaklaşım bunu yapmak olabilir, ama hantal. @ConfigurationSınıflara dayalı alternatif yaklaşımlar vardır , sorun aşağıdaki blog yazısında
Master Slave

2
Not, bu sadece bir @Component(veya türevlerinden herhangi biri @Repository, vb.)
Üzerinde çalışır

211

Başka bir yol da org.springframework.core.env.Environmentfasulyenize enjekte etmektir.

@Autowired
private Environment env;
....

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

6
erişmeniz gereken mülkün adı dinamik olarak değiştiğinde de kullanışlıdır
Paulo Merson

3
Özellikleri aramak isterseniz ne olur? Ve tümünün Ortam paket adını görebilmesi için içe aktarma ifadesini
eklemenizi önerebilir miyim

2
Yanlış Ortamı içe aktarmamaya dikkat edin. IntelBA CORBA Ortamını otomatik olarak içe aktardım.
Janac Meena

3
Ortamım neden boş?
Janac Meena

2
@JacacMeena, IntelliJ org.springframework.core.env.Environment
CORBA'nın

31

@ConfigurationPropertiesdeğerleri .properties( .ymlayrıca desteklenir) bir POJO ile eşlemek için kullanılabilir .

Aşağıdaki Örnek dosyayı ele alalım.

.özellikleri

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
}

Artık özellik değerine otomatik kablolama employeePropertiesile aşağıdaki gibi erişilebilir .

@Autowired
private Employee employeeProperties;

public void method() {

   String employeeName = employeeProperties.getName();
   String employeeDept = employeeProperties.getDept();

}

1
i bu şekilde kullanılan ve null dönüş var, ben src / test / kaynakları ve özellikleri java sınıfına (içinde kaydedilen özellik değeri) src / main / package / properties benim özellikler dosyasını koymak. neyi kaçırdım? teşekkürler
Ahmad Leo Yudanto

src/main/resourceskodunuzu bir Spring testinden test etmiyorsanız dosyaları kaydetmeniz gerekir .
JoBⅈN

@AhmadLeoYudanto ile aynı ve bunu değiştirmek için yapabileceğim hiçbir şey yok
Dimitri Kopriwa

6

Şu anda aşağıdaki üç yolu biliyorum:

1. @ValueEk açıklama

    @Value("${<property.name>}")
    private static final <datatype> PROPERTY_NAME;
  • Deneyimlerime göre, değeri alamadığınız veya ayarladığınız bazı durumlar vardır null. Örneğin, bir preConstruct()yöntemde veya yöntemde ayarlamaya çalıştığınızda init(). Bunun nedeni, değer enjeksiyonunun sınıf tam olarak oluşturulduktan sonra gerçekleşmesidir. Bu yüzden 3. seçeneği kullanmak daha iyidir.

2. @PropertySourceEk açıklama

<pre>@PropertySource("classpath:application.properties")

//env is an Environment variable
env.getProperty(configKey);</pre>
  • PropertySouceEnvironmentsınıf yüklendiğinde bir değişken içindeki (sınıfınızda) özellik kaynak dosyasındaki değerleri ayarlar . Böylece kolayca kelime getirebilirsin.
    • Sistem Ortamı değişkeni üzerinden erişilebilir.

3. @ConfigurationPropertiesEk açıklama.

  • Bu çoğunlukla Spring projelerinde yapılandırma özelliklerini yüklemek için kullanılır.
  • Mülk verilerine dayalı olarak bir varlığı başlatır.

    • @ConfigurationProperties yüklenecek özellik dosyasını tanımlar.
    • @Configuration yapılandırma dosyası değişkenlerine dayalı bir fasulye oluşturur.
    @ConfigurationProperties (önek = "kullanıcı")
    @Configuration ( "UserData")
    sınıf kullanıcısı {
      // Mülk ve alıcıları / belirleyicileri
    }
    
    @Autowired
    özel UserData userData;
    
    userData.getPropertyName ();

Varsayılan konumun üzerine yazılırsa ne olur spring.config.location? # 2 hala çalışıyor mu?
bmauter

Bu durumda öncelik yerine geçer. Spring.config.location komutunu kullanarak komut satırını kullandığınızda bildiğim kadarıyla yüksek önceliğe sahiptir, böylece mevcut olanı geçersiz kılar.
Dhwanil Patel

5

Siz de bu şekilde yapabilirsiniz ....

@Component
@PropertySource("classpath:application.properties")
public class ConfigProperties {

    @Autowired
    private Environment env;

    public String getConfigValue(String configKey){
        return env.getProperty(configKey);
    }
}

Daha sonra application.properties dosyasından okumak istediğiniz her yerde, getConfigValue yöntemini almak için anahtarı iletmeniz yeterlidir.

@Autowired
ConfigProperties configProp;

// Read server.port from app.prop
String portNumber = configProp.getConfigValue("server.port"); 

1
Paket nedir Environment?
e-info128

1
Burada bulabilirsiniz: org.springframework.core.env.Environment
lucifer

Varsayılan konumun üzerine yazılırsa ne olur spring.config.location?
bmauter

3

Sen kullanabilirsiniz @Valuedeğişkenleri yüklemek için application.propertiestek bir yerde bu değeri kullanacaksanız, ancak bir daha merkezi bir yol gerekirse bu değişkenleri yüklemek için@ConfigurationProperties iyi bir yaklaşımdır.

Ayrıca, doğrulamalarınızı ve iş mantığınızı gerçekleştirmek için farklı veri türlerine ihtiyacınız varsa değişkenleri yükleyebilir ve otomatik olarak yayınlayabilirsiniz.

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

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

3

bu adımları takip et. 1: - Aşağıda gördüğünüz gibi yapılandırma sınıfınızı oluşturun

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: - bir konfigürasyon sınıfınız olduğunda, değişkeni ihtiyacınız olan bir konfigürasyondan enjekte edin.

@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

Bir uygulama, application.properties dosyasından 3 tür değer okuyabilir.

application.properties


     my.name=kelly

my.dbConnection ={connection_srting:'http://localhost:...',username:'benz',password:'pwd'}

sınıf dosyası

@Value("${my.name}")
private String name;

@Value("#{${my.dbConnection}}")
private Map<String,String> dbValues;

Application.properties dosyasında bir mülkünüz yoksa, varsayılan değeri kullanabilirsiniz

        @Value("${your_name : default value}")
         private String msg; 

0

Spring-boot bize harici yapılandırmalar sağlamak için çeşitli yöntemler sağlar, özellik dosyası yerine application.yml veya yaml dosyalarını kullanmayı deneyebilir ve farklı ortamlara göre farklı özellik dosyaları kurulumu sağlayabilirsiniz.

Her ortamın özelliklerini ayrı yay profilleri altında ayrı yml dosyalarına ayırabiliriz.Ardından dağıtım sırasında şunları kullanabilirsiniz:

java -jar -Drun.profiles=SpringProfileName

Hangi yay profilinin kullanılacağını belirtmek için. yml dosyalarının adı gibi olması gerektiğini unutmayın

application-{environmentName}.yml

otomatik olarak springboot tarafından alınmaları için.

Referans : https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties

Application.yml veya özellik dosyasından okumak için:

En kolay yolu mülkiyet dosyasından bir değerini okumak veya yml doğrudan gibi çevreden bu değerleri kullanabilmesi için, bahar @value annotation.Spring otomatik yay çevreye YML gelen tüm değerleri yükler kullanmaktır:

@Component
public class MySampleBean {

@Value("${name}")
private String sampleName;

// ...

}

Ya da yayın kuvvetle yazılan fasulyeleri okumak için sağladığı başka bir yöntem şöyledir:

YML

ymca:
    remote-address: 192.168.1.1
    security:
        username: admin

Yml okumak için karşılık gelen 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) { ... }
    }
}

Yukarıdaki yöntem yml dosyalarıyla iyi çalışır.

Referans: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html


0

Benim için yukarıdakilerin hiçbiri doğrudan benim için çalışmadı. Yaptığım şey şudur:

Ayrıca @Rodrigo Villalba Zayas cevabını
implements InitializingBeansınıfa ekledim
ve yöntemi uyguladım

@Override
public void afterPropertiesSet() {
    String path = env.getProperty("userBucket.path");
}

Yani böyle görünecek

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

Özellik değerlerini almanın en iyi yolları kullanmaktır.

1. Değer ek açıklamasını kullanma

@Value("${property.key}")
private String propertyKeyVariable;

2. Enviornment fasulye kullanarak

@Autowired
private Environment env;

public String getValue() {
    return env.getProperty("property.key");
}

public void display(){
  System.out.println("# Value : "+getValue);
}

0

En iyi şey, @Valuenesnenize otomatik olarak değer atayacağı ek açıklama kullanmaktır private Environment en. Bu, kodunuzu azaltacaktır ve dosyalarınızı filtrelemek kolay olacaktır.


0

İki yol var,

  1. doğrudan @Valuesınıfınızda kullanabilirsiniz
    @Value("#{'${application yml field name}'}")
    public String ymlField;

VEYA

  1. Temizlemek için tüm @Configurationsınıfları ekleyebileceğiniz sınıfı temizleyebilirsiniz .@value
@Configuration
public class AppConfig {

    @Value("#{'${application yml field name}'}")
    public String ymlField;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.