2014-10-01 15 views
26

Spring Boot'un @ConfigurationProperties ek açıklaması ile değişmez (son) alanlara sahip olmak mümkün mü? ÖrnekImmutable @ConfigurationProperties

@ConfigurationProperties(prefix = "example") 
public final class MyProps { 

    private final String neededProperty; 

    public MyProps(String neededProperty) { 
    this.neededProperty = neededProperty; 
    } 

    public String getNeededProperty() { .. } 
} 

Yaklaşımlar altında şimdiye kadar denedim: boş ve neededProperty argüman

  • ile:

      • iki Kurucular sağlanması iki Kurucular ile MyProps sınıfın bir @Bean oluşturma Fasulye new MyProps()
      • ile oluşturulur. MyProps fasulye sağlamak @ComponentScan ve @Component kullanma null
    1. . Her sonda olmayan alan için alıcı/ayarlayıcı sağlayarak>NoSuchMethodException: MyProps.<init>()

    sadece o çalışma var yoludur - BeanInstantiationException yılında

    • sonuçları.

  • +1

    yardımcı olacağını umuyoruz

    azaltabileceğini yapmaya çalışmak kutunun dışında çalışmayacak. – geoand

    +0

    Bu çok üzücü.Tabii ki, her zaman, '@ Değeri' ek açıklama ile yapıcı parametreler kullanarak düz bir yay ile yapabilirim. Ancak, Spring Boot'un bunu desteklemesi de hoş olurdu. – RJo

    +0

    Kaynak kodda küçük bir zirve yaptım, ama ne soruyorsun gibi bir şeyleri desteklemek için önemsiz değil. Tabii ki Spring internals konusunda uzman değilim, bu yüzden bariz bir şey kaçırıyor olabilirim – geoand

    cevap

    10

    Bu sorunu çok sık çözmek zorundayım ve bir sınıfta final değişkenlerini kullanmamı sağlayan biraz farklı bir yaklaşım kullanıyorum.

    Her şeyden önce, tüm yapılandırmamı ApplicationProperties olarak adlandırılan tek bir yerde (sınıf) saklıyorum. Bu sınıf, belirli bir önekle @ConfigurationProperties ek açıklamasına sahiptir. Ayrıca, yapılandırma sınıfına (veya ana sınıfa) karşı @EnableConfigurationProperties ek açıklamasında da listelenir.

    Daha sonra ApplicationProperties yapıcı argümanı olarak sağladım ve yapıcı içinde final alanına atama gerçekleştirdim.

    Örnek:

    Ana sınıfı:

    @SpringBootApplication 
    @EnableConfigurationProperties(ApplicationProperties.class) 
    public class Application { 
        public static void main(String... args) throws Exception { 
         SpringApplication.run(Application.class, args); 
        } 
    } 
    

    ApplicationProperties sınıfı

    @ConfigurationProperties(prefix = "myapp") 
    public class ApplicationProperties { 
    
        private String someProperty; 
    
        // ... other properties and getters 
    
        public String getSomeProperty() { 
         return someProperty; 
        } 
    } 
    

    ve bir sınıf nihai özellikleri

    @Service 
    public class SomeImplementation implements SomeInterface { 
        private final String someProperty; 
    
        @Autowired 
        public SomeImplementation(ApplicationProperties properties) { 
         this.someProperty = properties.getSomeProperty(); 
        } 
    
        // ... other methods/properties 
    } 
    

    Bu yaklaşımı birçok farklı nedenden dolayı tercih ederim. Bir kurucuda daha fazla özellik kurmam gerekirse, her zaman bir argümanım olduğu için yapıcı argümanlarımın listesi "büyük" değildir (benim durumumda ApplicationProperties); daha final özelliklerini eklemek için bir ihtiyaç varsa, benim yapıcısı aynı (tek argüman) kalır - senin ne vb başka yerde değişiklik sayısını Ben Bildiğim kadarıyla

    +1

    Bu sadece @Value –

    +0

    kullanarak bir kazan plakası çok Bu, [etiket: Java]. Daha fazla boilerplate daha iyi kod anlamına gelir – Clijsters

    +0

    @Clijsters Dürüst olmak gerekirse, cıvıl cıvıl cıvıl cı cı cı cı cı cı cı cı cı cı cı cı cı cı cı cı dı dı dır dı dı dı dıı dıı dıı dıı dıı dıı dıı! –

    İlgili konular