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.
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