$ tree src
src
├── main
│ ├── java
│ │ └── info
│ │ └── maigo
│ │ └── lab
│ │ └── sample
│ │ └── profiles
│ │ ├── MyData.java
│ │ ├── MyDataForDefault.java
│ │ ├── MyDataForDevelopment.java
│ │ ├── MyDataForTestAndProduction.java
│ │ ├── MyRestController.java
│ │ └── ProfilesApplication.java (← Diesmal wird der Inhalt weggelassen)
│ └── resources
│ ├── application-development.properties
│ ├── application-production.properties
│ ├── application-test.properties
│ └── application.properties
MyRestController.java
Injizieren Sie MyData-Objekte mit der DI-Funktion des Spring Framework. Schreiben Sie die Annotation @Autowired in die Instanzvariable myData. Lässt MyData-Informationen in JSON zurückgeben, wenn auf http: // localhost: 8080 / zugegriffen wird.
package info.maigo.lab.sample.profiles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyRestController {
@Autowired
private MyData myData;
@RequestMapping("/")
public MyData index() {
return myData;
}
}
MyData.java
Schnittstellendefinition für das MyData-Objekt. Diesmal ist keine Methode vorbereitet.
package info.maigo.lab.sample.profiles;
public interface MyData {
}
MyDataForDefault.java
Die im Standardprofil verwendete MyData-Implementierungsklasse. Sie können das Profil bei DI mit der Annotation @Profile angeben. Hier wird die Standardeinstellung angegeben. Weisen Sie dem Instanzvariablenprofil die Zeichenfolge "default" zu. Weisen Sie der Instanzvariablennachricht den Nachrichtenwert von application.properties zu.
package info.maigo.lab.sample.profiles;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
@Component
@Profile("default")
public class MyDataForDefault implements MyData {
public String profile = "default";
@Value("${message.value}")
public String message;
}
application.properties
Eigenschaftendatei, die im Standardprofil verwendet wird.
message.value=Hello, default!
Geben Sie die durch das Erstellen erstellte JAR-Datei an und starten Sie sie. Es werden keine Parameter hinzugefügt, um das Profil anzugeben.
$ java -jar target/profiles-0.0.1-SNAPSHOT.jar
Wenn Sie auf den gestarteten Server zugreifen, können Sie sehen, dass die Informationen des Standardprofils geladen sind.
$ curl http://localhost:8080/
{"profile":"default","message":"Hello, default!"}
MyDataForDevelopment.java
Die im Entwicklungsprofil verwendete MyData-Implementierungsklasse. Geben Sie das Entwicklungsprofil mit der Annotation @Profile an. Weisen Sie dem Instanzvariablenprofil die Zeichenfolge "Entwicklung" zu. Weisen Sie der Instanzvariablennachricht message.value von application-development.properties zu.
package info.maigo.lab.sample.profiles;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
@Component
@Profile("development")
public class MyDataForDevelopment implements MyData {
public String profile = "development";
@Value("${message.value}")
public String message;
}
application-development.properties
Im Entwicklungsprofil verwendete Eigenschaftendatei.
message.value=Hello, development!
Geben Sie die Entwicklung im JVM-Parameter -Dspring.profiles.active an.
$ java -Dspring.profiles.active=development -jar target/profiles-0.0.1-SNAPSHOT.jar
Wenn Sie auf den gestarteten Server zugreifen, können Sie sehen, dass die Informationen zum Entwicklungsprofil geladen sind.
$ curl http://localhost:8080/
{"profile":"development","message":"Hello, development!"}
MyDataForTestAndProduction.java
Die in den Test- und Produktionsprofilen verwendete MyData-Implementierungsklasse. Test und Produktion sind in der Annotation @Profile angegeben. Objekte dieser Klasse unterliegen DI, wenn eines der angegebenen Profile angegeben wird. Das von @RestController zurückgegebene JSON-Profil wird von der getProfile-Methode dieser Klasse generiert. Sie können mehrere Profilnamen abrufen, die von Environment # getActiveProfiles angegeben werden.
package info.maigo.lab.sample.profiles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
@Component
@Profile({"test", "production"})
public class MyDataForTestAndProduction implements MyData {
@Autowired
private Environment env;
public String getProfile() {
return String.join(",", env.getActiveProfiles());
}
@Value("${message.value}")
public String message;
}
application-test.properties
Im Testprofil verwendete Eigenschaftendatei.
message.value=Hello, test!
application-production.properties
Im Produktionsprofil verwendete Eigenschaftendatei.
message.value=Hello, production!
Geben Sie einen Test für den JVM-Parameter -Dspring.profiles.active an.
$ java -Dspring.profiles.active=test -jar target/profiles-0.0.1-SNAPSHOT.jar
Wenn Sie auf den gestarteten Server zugreifen, können Sie sehen, dass die Testprofilinformationen geladen sind.
$ curl http://localhost:8080/
{"message":"Hello, test!","profile":"test"}
Geben Sie die Produktion im JVM-Parameter -Dspring.profiles.active an.
$ java -Dspring.profiles.active=production -jar target/profiles-0.0.1-SNAPSHOT.jar
Wenn Sie auf den gestarteten Server zugreifen, können Sie sehen, dass die Produktionsprofilinformationen geladen sind.
$ curl http://localhost:8080/
{"message":"Hello, production!","profile":"production"}
Geben Sie im JVM-Parameter -Dspring.profiles.active mehrere durch Kommas getrennte Profile "Test, Produktion" an.
$ java -Dspring.profiles.active=test,production -jar target/profiles-0.0.1-SNAPSHOT.jar
Wenn Sie auf den gestarteten Server zugreifen, können Sie sehen, dass die Profilinformationen von Test und Produktion gelesen werden, da der Wert des Profilelements "Test, Produktion" enthält.
$ curl http://localhost:8080/
{"message":"Hello, production!","profile":"test,production"}
Der in application-test.properties und application-production.properties definierte Wert von message.value ist das Ergebnis des Konflikts. Der Wert von application-production.properties wird priorisiert (es wird davon ausgegangen, dass der zu konfliktierende Wert nicht festgelegt werden sollte). ..
Als ich versuchte, "Produktion, Test" in umgekehrter Reihenfolge der Profilspezifikation anzugeben, wurde der Wert von application-test.properties priorisiert.
$ java -Dspring.profiles.active=production,test -jar target/profiles-0.0.1-SNAPSHOT.jar
$ curl http://localhost:8080/
{"message":"Hello, test!","profile":"production,test"}
Möglicherweise hat das später angegebene Profil Vorrang (überschreiben?).
Recommended Posts