Federprofile
1. Überblick
In diesem Artikel konzentrieren wir uns auf die Einführung vonProfiles in Spring.
Profile sind ein Kernmerkmal des Frameworks, mit dem wir unsere Beans verschiedenen Profilen zuordnen können, z. B.dev,test,prod.
Wir können dann verschiedene Profile in verschiedenen Umgebungen aktivieren, um genau die Beans zu booten, die wir benötigen:
Weitere Lektüre:
Separate Spring DataSource für Tests konfigurieren
Ein schnelles, praktisches Tutorial zum Konfigurieren einer separaten Datenquelle zum Testen in einer Spring-Anwendung.
Eigenschaften mit Feder und Spring Boot
Lernprogramm zum Arbeiten mit Eigenschaftendateien und Eigenschaftswerten in Spring.
2. Verwenden Sie@Profile für eine Bohne
Beginnen wir einfach und schauen wir uns an, wie wir eine Bohne zu einem bestimmten Profil gehören lassen können. Mit der Annotation@Profile ordnen wir die Bean diesem bestimmten Profil zu. Die Anmerkung enthält einfach die Namen eines (oder mehrerer) Profile.
Stellen Sie sich ein Basisszenario vor - wir haben eine Bean, die nur während der Entwicklung aktiv sein sollte, aber nicht in der Produktion bereitgestellt wird. Wir kommentieren diese Bean mit einem "dev" -Profil und sie wird nur während der Entwicklung im Container vorhanden sein - in der Produktion sind diedev einfach nicht aktiv:
@Component
@Profile("dev")
public class DevDatasourceConfig
Als kurze Ergänzung kann den Profilnamen auch ein NOT-Operator vorangestellt werden, z. „!dev“, um sie von einem Profil auszuschließen.
Im folgenden Beispiel wird die Komponente nur aktiviert, wenn das Profil "dev" nicht aktiv ist:
@Component
@Profile("!dev")
public class DevDatasourceConfig
3. Deklarieren Sie Profile in XML
Profile können auch in XML konfiguriert werden. Das Tag<beans>hat das Attribut“profiles”, das durch Kommas getrennte Werte der entsprechenden Profile verwendet:
4. Profile festlegen
Im nächsten Schritt müssen die Profile aktiviert und so eingestellt werden, dass die jeweiligen Beans im Container registriert sind.
Dies kann auf verschiedene Arten geschehen - die wir in den folgenden Abschnitten untersuchen werden.
4.1. Programmatisch über die Schnittstelle vonWebApplicationInitializer
In Webanwendungen könnenWebApplicationInitializer verwendet werden, umServletContext programmgesteuert zu konfigurieren.
Es ist auch ein sehr praktischer Ort, um unsere aktiven Profile programmgesteuert festzulegen:
@Configuration
public class MyWebApplicationInitializer
implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter(
"spring.profiles.active", "dev");
}
}
4.2. Programmatisch überConfigurableEnvironment
Sie können Profile auch direkt in der Umgebung festlegen:
@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("someProfile");
4.3. Kontextparameter inweb.xml
In ähnlicher Weise auchprofiles can be activated in the web.xml der Webanwendung unter Verwendung eines Kontextparameters:
contextConfigLocation
/WEB-INF/app-config.xml
spring.profiles.active
dev
4.4. JVM-Systemparameter
Die Profilnamen können auch über einen JVM-Systemparameter übergeben werden. Die als Parameter übergebenen Profilnamen werden beim Start der Anwendung aktiviert:
-Dspring.profiles.active=dev
4.5. Umgebungsvariable
In einer Unix-Umgebung sindprofiles can also be activated via the environment variable:
export spring_profiles_active=dev
4.6. Maven-Profil
Federprofile können auch über Maven-Profile aktiviert werden, indem die Sconfigurationseigenschaftspring.profiles.active angegeben wird.
In jedem Maven-Profil können wir die Eigenschaftspring.profiles.activefestlegen:
dev
true
dev
prod
prod
Sein Wert wird verwendet, um den Platzhalter von@[email protected]inapplication.properties zu ersetzen:
[email protected]@
Jetzt müssen wir die Ressourcenfilterung inpom.xml aktivieren:
src/main/resources
true
...
Fügen Sie einen-P-Parameter hinzu, um zu wechseln, welches Maven-Profil angewendet wird:
mvn clean package -Pprod
Dieser Befehl packt die Anwendung für das Profil vonprod. Es wendet auch denspring.profiles.active -Wert‘prod' für diese Anwendung an, wenn sie ausgeführt wird.
4.7. @ActiveProfile in Tests
Mithilfe von Tests können Sie ganz einfach angeben, welche Profile aktiv sind. Verwenden Sie die Annotation@ActiveProfile, um bestimmte Profile zu aktivieren:
@ActiveProfiles("dev")
Zusammenfassend haben wir uns mehrere Möglichkeiten angesehen, Profile zu aktivieren. Lassen Sie uns nun sehen, welche Priorität hat und welche passiert, wenn Sie mehr als eine verwenden - von der höchsten zur niedrigsten Priorität:
-
Kontextparameter inweb.xml
-
WebApplicationInitializer
-
JVM-Systemparameter
-
Umgebungsvariable
-
Maven-Profil
5. Das Standardprofil
Jede Bean, die kein Profil angibt, gehört zum Profil "default".
Spring bietet auch eine Möglichkeit, das Standardprofil festzulegen, wenn kein anderes Profil aktiv ist - mithilfe der Eigenschaft "spring.profiles.default".
6. Aktive Profile abrufen
Die aktiven Profile von Spring steuern das Verhalten der Annotation@Profilezum Aktivieren / Deaktivieren von Beans. Möglicherweise möchten wir jedoch auch programmgesteuert auf die Liste der aktiven Profile zugreifen.
Wir haben zwei Möglichkeiten:using Environment or*spring.active.profile*.
6.1. Verwenden vonEnvironment
Wir können vom ObjektEnvironmentauf die aktiven Profile zugreifen, indem wir es einfügen:
public class ProfileManager {
@Autowired
private Environment environment;
public void getActiveProfiles() {
for (String profileName : environment.getActiveProfiles()) {
System.out.println("Currently active profile - " + profileName);
}
}
}
6.2. Verwenden vonspring.active.profile
Alternativ können wir auf die Profile zugreifen, indem wir die Eigenschaftspring.profiles.active einfügen:
@Value("${spring.profiles.active}")
private String activeProfile;
Hier ist unsereactiveProfile-Variablewill contain the name of the profile that is currently active, und wenn es mehrere gibt, enthält sie ihre Namen, die durch ein Komma getrennt sind.
Wir sollten jedochconsider what would happen if there is no active profile at all. In unserem obigen Code würde das Fehlen eines aktiven Profils die Erstellung des Anwendungskontexts verhindern. Dies würde aufgrund des fehlenden Platzhalters zum Einfügen in die Variable zu einemIllegalArgumentExceptionführen.
Um dies zu vermeiden, können wirdefine a default value:
@Value("${spring.profiles.active:}")
private String activeProfile;
Wenn jetzt keine Profile aktiv sind, enthalten unsereactiveProfile nur eine leere Zeichenfolge. Und wenn wir wie im vorherigen Beispiel auf die Liste zugreifen möchten, können wir dies mitsplitting der VariablenactiveProfiletun:
public class ProfileManager {
@Value("${spring.profiles.active:}")
private String activeProfiles;
public String getActiveProfiles() {
for (String profileName : activeProfiles.split(",")) {
System.out.println("Currently active profile - " + profileName);
}
}
}
7. Beispiel für die Verwendung von Profilen
Nachdem die Grundlagen nicht mehr im Weg sind, schauen wir uns ein reales Beispiel an.
Stellen Sie sich ein Szenario vor, in dem die Datenquellenkonfiguration sowohl für die Entwicklungs- als auch für die Produktionsumgebung verwaltet werden muss. Erstellen wir eine gemeinsame SchnittstelleDatasourceConfig, die von beiden Datenquellenimplementierungen implementiert werden muss:
public interface DatasourceConfig {
public void setup();
}
Es folgt die Konfiguration für die Entwicklungsumgebung:
@Component
@Profile("dev")
public class DevDatasourceConfig implements DatasourceConfig {
@Override
public void setup() {
System.out.println("Setting up datasource for DEV environment. ");
}
}
Und Konfiguration für die Produktionsumgebung:
@Component
@Profile("production")
public class ProductionDatasourceConfig implements DatasourceConfig {
@Override
public void setup() {
System.out.println("Setting up datasource for PRODUCTION environment. ");
}
}
Jetzt erstellen wir einen Test und fügen unsere DatasourceConfig-Schnittstelle ein. Abhängig vom aktiven Profil injiziert SpringDevDatasourceConfig oderProductionDatasourceConfig Bean:
public class SpringProfilesWithMavenPropertiesIntegrationTest {
@Autowired
DatasourceConfig datasourceConfig;
public void setupDatasource() {
datasourceConfig.setup();
}
}
Wenn das Profil "dev" aktiv ist, injiziert die Feder das Objekt vonDevDatasourceConfig, und beim Aufruf der Methode vonsetup()folgt die folgende Methode:
Setting up datasource for DEV environment.
8. Profile im Spring Boot
Spring Boot unterstützt alle bisher beschriebenen Profilkonfigurationen mit einigen zusätzlichen Funktionen.
Der in Abschnitt 4 eingeführte Initialisierungsparameterspring.profiles.active kann auch in Spring Boot als Eigenschaft eingerichtet werden, um aktuell aktive Profile zu definieren. Dies ist eine Standardeigenschaft, die Spring Boot automatisch aufnimmt:
spring.profiles.active=dev
Um Profile programmgesteuert festzulegen, können wir auch die KlasseSpringApplicationverwenden:
SpringApplication.setAdditionalProfiles("dev");
Um Profile mit Maven in Spring Boot festzulegen, können Sie Profilnamen unterspring-boot-maven-plugin inpom.xml: angeben
org.springframework.boot
spring-boot-maven-plugin
dev
...
Und führen Sie das Spring Boot-spezifische Maven-Ziel aus:
mvn spring-boot:run
Die wichtigste profilbezogene Funktion, die Spring Boot bietet, istprofile-specific properties files. Diese müssen im Formatapplications-{profile}.properties benannt werden.
Spring Boot lädt automatisch die Eigenschaften in eineapplication.properties-Datei für alle Profile und diejenigen in profilspezifischen.properties-Dateien nur für das angegebene Profil.
Beispielsweise können wir verschiedene Datenquellen fürdev- undproduction-Profile konfigurieren, indem wir zwei Dateien mit den Namenapplication-dev.properties undapplication-production.properties verwenden:
In der Dateiapplication-production.properties können wir eine DatenquelleMySqleinrichten:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db
spring.datasource.username=root
spring.datasource.password=root
Anschließend können wir dieselben Eigenschaften für dasdev-Profil in derapplication-dev.properties-Datei konfigurieren, um eine speicherinterneH2-Datenbank zu verwenden:
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa
Auf diese Weise können wir problemlos verschiedene Konfigurationen für verschiedene Umgebungen bereitstellen.
9. Fazit
In diesem kurzen Tutorial haben wir besprochen, wiedefine a profile auf einer Bean und dannenable the right profiles in unserer Anwendung verwendet werden.
Schließlich haben wir unser Verständnis von Profilen anhand eines einfachen, aber dennoch realen Beispiels bestätigt.
Die Implementierung dieses Spring Security REST-Tutorials finden Sie inthe GitHub project - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.