2016-08-04 14 views
1

Ich bin ein Spring-Rookie und versuche, von den Vorteilen der einfachen 'Profil'-Handhabung von Spring zu profitieren. Ich habe dieses Tutorial bereits durchgearbeitet: https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile und jetzt möchte ich dieses Konzept an ein einfaches Beispiel anpassen. Ich habe zwei Profile: dev und prod. Ich stelle mir eine Klasse für jedes Profil vor, wo ich abhängig vom eingestellten Profil verschiedene Beans instanziieren kann (jeweils eine gemeinsame Schnittstelle implementierend).Mehrere Spring-Konfigurationsdateien (eine pro Profil)

Meine aktuell verwendete Klassen wie folgt aussehen:

StatusController.java

@RestController 
@RequestMapping("/status") 
public class StatusController { 

    private final EnvironmentAwareBean environmentBean; 

    @Autowired 
    public StatusController(EnvironmentAwareBean environmentBean) { 
     this.environmentBean = environmentBean; 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    Status getStatus() { 
     Status status = new Status(); 
     status.setExtra("environmentBean=" + environmentBean.getString()); 
     return status; 
    } 
} 

EnvironmentAwareBean.java

public interface EnvironmentAwareBean { 
    String getString(); 
} 

EnvironmentAwareBean.java

@Service 
public class DevBean implements EnvironmentAwareBean { 
    @Override 
    public String getString() { 
     return "development"; 
    } 
} 

EnvironmentAwareBean.java

@Service 
public class ProdBean implements EnvironmentAwareBean { 
    @Override 
    public String getString() { 
     return "production"; 
    } 
} 

DevConfig.java

@Configuration 
@Profile("dev") 
public class DevConfig { 

    @Bean 
    public EnvironmentAwareBean getDevBean() { 
     return new DevBean(); 
    } 
} 

ProdConfig.java

@Configuration 
@Profile("prod") 
public class ProdConfig { 

    @Bean 
    public EnvironmentAwareBean getProdBean() { 
     return new ProdBean(); 
    } 

} 

das Beispiel Lauf wirft diese Ausnahme bei der Inbetriebnahme (SPRING_PROFILES_DEFAULT-dev gesetzt):

(...) UnsatisfiedDependencyException: (...) verschachtelt Ausnahme org.springframework.beans.factory.NoUniqueBeanDefinitionException ist: Keine Warte Bohne vom Typ [EnvironmentAwareBean] ist definiert: erwartet einzelne übereinstimmende Bean, aber gefunden 3: prodBean, devBean, getDevBean

Ist meine Vorgehensweise weit von einer empfohlenen Konfiguration? Meiner Meinung nach wäre es sinnvoller, jede Configuration mit der @Profile Annotation zu kommentieren, anstatt sie für jede Bean zu tun und möglicherweise einige Varianten zu vergessen, wenn später neue Klassen hinzugefügt werden.

Antwort

2

Ihre Implementierungen von EnvironmentAwareBean sind alle mit @Service gekennzeichnet.

Dies bedeutet, dass sie alle durch Scannen von Komponenten aufgenommen werden und daher mehr als eine passende Bean erhalten. Müssen sie mit @Service kommentiert werden?

Annotation jeder @Configuration mit der @Profile Annotation ist in Ordnung. Eine andere Möglichkeit als Bildungsübung wäre, @Profile nicht zu verwenden und stattdessen die Klassen @Bean oder Config mit Ihrer eigenen Implementierung von @Conditional annotieren.

+0

Vielen Dank. Ich habe gerade die '@ Service' Annotation entfernt und nun funktioniert es so, wie ich es mir denken sollte :) Ich werde auch in die '@ Conditional' Annotation schauen. – user3105453