2016-08-12 5 views
3

Ich habe eine Spring Boot Web-Anwendung, die Restdienste ausstellt.Ist @Profile von Spring auf Methoden eine gute Praxis?

Ich frage mich, wie man Profile auf Filtern richtig verwaltet. Eigentlich hat meine App 2 Profile: Dev und Prod (Sie raten, was es für ... steht)

Im prod-Modus habe ich mehr Filter aktivieren als im Dev-Modus.

Meine Filter Konfigurationsklasse ist die folgende:

@Configuration 
public class FiltersConfig { 

    @Bean 
    public FilterRegistrationBean filterRegistrationBean(CompositeFilter compositeFilter){ 
     FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); 
     filterRegistrationBean.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); 
     filterRegistrationBean.addUrlPatterns("/*"); 
     filterRegistrationBean.setFilter(compositeFilter); 
     return filterRegistrationBean; 
    } 

    @Bean 
    @Profile("dev") 
    public CompositeFilter devCompositeFilter(){ 
     CompositeFilter compositeFilter = new CompositeFilter(); 
     List<Filter> filtersList = new ArrayList<>(); 
     //filtersList.add(filter1()); 
     compositeFilter.setFilters(filtersList); 
     return compositeFilter; 
    } 


    @Bean 
    @Profile("prod") 
    public CompositeFilter prodCompositeFilter(){ 
     CompositeFilter compositeFilter = new CompositeFilter(); 
     List<Filter> filtersList = new ArrayList<>(); 
     //filtersList.add(filter1()); 
     compositeFilter.setFilters(filtersList); 
     return compositeFilter; 
    } 
} 

Meine Fragen sind:

  • Ist es eine gute Praxis @Profile auf Methode hinzufügen?
  • Gibt es eine Möglichkeit, den Compiler zum Ausschließen von Klassen, Methoden usw. zu zwingen, die mit einem anderen Profil als dem als aktuell angegebenen versehen sind? (Ich möchte nicht, dass mein Produktions-Jar/Krieg mit unnötigem Code gefüllt wird!)
  • Bietet Spring-Boot eine klarere Möglichkeit, Profile zu organisieren?

thx.

Antwort

0

denke ich, es wäre besser, Konfigurationen für unterschiedliche Umgebungen in verschiedenen Paketen zu haben. Sie möchten Ihre Konfiguration nicht mischen. Die Struktur könnte wie folgt aussehen:

config 
    - Config1.java 
    - Config2.java 
    dev 
     - WebConfig.java 
     - DataConfig.java 
    prod 
     - WebConfig.java 
     - DataConfig.java 
+0

Keine bessere Antwort gefunden noch ... –

0

Ist es eine gute Praxis, @Profile on method hinzuzufügen?

Es ist die Feder Ansatz für dieses Problem - so ist es mit dem Feder Ökosystem in Einklang

Gibt es eine Möglichkeit, die Compiler zu erzwingen Klassen auszuschließen, Methoden, etc. mit einem diferent kommentierten Profile als die als Strom gesetzt? (Ich will nicht meine Produktion jar/Krieg mit unnötigem Code aufgefüllt!)

Sie würden zu stimmen haben Build Klassen auszuschließen - ein weiteren Ansatz ist es, die Bohnen mit Ids zu konfigurieren und verwenden, die IDs und Konfiguration pro Umgebung. Ein ähnlicher Ansatz to

Nach meiner Erfahrung Profile sind leichter

Hat Federverschluß eine klarere Art und Weise liefern Profile zu organisieren?

Nicht, dass ich kenne, mit Ausnahme des Ansatzes in dem obigen Link

+0

Wenn ich meine Build auf Klasse ausschließen, bedeutet das, dass ich @Profile auf der Klasse und nicht auf der Methode richtig eingestellt habe? Weil, wenn ich auf der gleichen Klasse zwei Methoden habe, die mit einem anderen Profil kommentiert wurden, denke ich, dass beide Methoden in der .class-Datei kompiliert werden, unabhängig vom Profil, das zur Kompilierzeit verwendet wird! Das ist genau das, was für mich verwirrend ist. –

+0

Oder verwenden Sie eine Art Build-Prozess-Filterung - ich denke, das würde ein Profil-Konzept in Ihren Build-Prozess verschieben – farrellmr

0

In meiner eigenen Erfahrung mit @Profile in jedem Java-Code keine gute Idee ist. Das ist, warum ich glaube, Sie verwenden es im Code zu vermeiden haben:

  1. Sie können immer Eigenschaft definieren wie my.feature-for-the-profile.enable unter Verwendung von Profil, um das gleiche Ziel zu erreichen.
  2. Profile divergieren manchmal, behalten Sie jede sich ändernde Konfiguration, da Eigenschaften Ihnen mehr Kontrolle über alles geben, überall.
  3. Spring Boot hat eine gut definierte Profil-spezifische Externalize-Eigenschaften Unterstützung (wie Application-Prod.yml). Das Profil in Ihrer Code-Basis wird die Dinge komplizierter machen und manchmal in die Irre führen.
  4. Sie können Eigenschaften einfacher ändern oder überschreiben, als den Code zu aktualisieren und neu zu kompilieren.
  5. ProfileCondition (als Meta-Annotation auf @Profile) ist kein SpringBootCondition, Sie können /autoconfig nicht verwenden, um festzustellen, ob es aktiviert ist oder nicht.

Unterm Strich: Definieren Sie Profile für properties, nicht für @Configuration s noch @Bean s.

Wenn Sie wirklich für Ihre Produktion Code ausschließen Test Zeug wollen, einen Blick auf die Dokumentation von spring-boot-devtools nehmen, wenn Ihr Maven verwenden, können Sie alle Testklassen/Ressourcen in einem separaten Modul setzen, und seine als <optional>true</optional> markieren oder definiere das maven-Profil dafür. Beachten Sie, dass Maven Profil und Spring Boot Profil zur gleichen Zeit vielleicht verwirrend!

Verwandte Themen