Inhaltsverzeichnis
1. Hintergrund
二、需求
三、分析
1、什么时候向SpringBoot中加入我们自己的配置属性
2、获取配置属性的优先级
3、何时加入我们自己的配置
四、实现
1、引入SpringBoot依赖
2、在application.properties中配置属性
3、编写自定义属性并加入Spring Environment中
4、通过SPI使自定义的配置生效
5、编写测试类,输出定义的 username 属性的值
6、运行结果
五、注意事项
1、日志无法输出
1. Wann wir unsere eigenen Konfigurationseigenschaften zu SpringBoot hinzufügen
2. Die Priorität beim Erhalten von Konfigurationseigenschaften
3. Wann wir unsere eigene Konfiguration hinzufügen
1. Führen Sie SpringBoot-Abhängigkeiten ein
2. Konfigurieren Sie Eigenschaften in application.properties
3. Schreiben Sie benutzerdefinierte Eigenschaften und fügen Sie sie zur Spring-Umgebung hinzu
4. Sorgen Sie dafür, dass die benutzerdefinierte Konfiguration über SPI wirksam wird.
5. Schreiben Sie eine Testklasse und geben Sie den Wert des definierten Benutzernamenattributs aus
6. Ergebnisse ausführen
1 . Das Protokoll kann nicht ausgegeben werden.
3、日志系统如何初始化
Heim Java javaLernprogramm So verwenden Sie den EnvironmentPostProcessor von SpringBoot

So verwenden Sie den EnvironmentPostProcessor von SpringBoot

May 22, 2023 am 09:25 AM
springboot environmentpostprocessor

    1. Hintergrund

    Das Apollo-Konfigurationscenter wurde im vorherigen Projekt verwendet. Nach dem Andocken des Apollo-Konfigurationscenters können die Eigenschaften des Konfigurationscenters im Programm verwendet werden Ist das Wolltuch umgesetzt? Wann wurden die Eigenschaften des Konfigurationscenters in das Programm geladen? Wenn wir also herausfinden, wie dies implementiert wird, können wir dann Konfigurationseigenschaften von überall laden und Funktionen von Konfigurationseigenschaften verschlüsseln und entschlüsseln? Apollo配置中心,对接Apollo配置中心后,配置中心的属性就可以在程序中使用了,那么这个是怎么实现的呢?配置中心的属性又是何时加载到程序中的呢?那么我们如果找到了这个是怎么实现的是否就可以 从任何地方加载配置属性配置属性的加解密功能呢

    二、需求

    So verwenden Sie den EnvironmentPostProcessor von SpringBoot

    从上图中得知,我们的需求很简单,即我们自己定义的属性需要比配置文件中的优先级更高。

    三、分析

    1、什么时候向SpringBoot中加入我们自己的配置属性

    当我们想在Bean中使用配置属性时,那么我们的配置属性必须在Bean实例化之前就放入到Spring到Environment中。即我们的接口需要在 application context refreshed 之前进行调用,而 EnvironmentPostProcessor 正好可以实现这个功能。

    2、获取配置属性的优先级

    我们知道在 Spring中获取属性是有优先级的。
    比如我们存在如下配置属性 username

    ├─application.properties
    │   >> username=huan
    ├─application-dev.properties
    │   >> username=huan.fu
    Nach dem Login kopieren

    那么此时 username 的值是什么呢?此处借用 Apollo的一张图来说解释一下这个问题。

    参考链接:https://www.apolloconfig.com/#/zh/design/apollo-design

    So verwenden Sie den EnvironmentPostProcessor von SpringBoot

    Spring从3.1版本开始增加了ConfigurableEnvironmentPropertySource

    ConfigurableEnvironment
    Nach dem Login kopieren
    • Spring的ApplicationContext会包含一个Environment(实现ConfigurableEnvironment接口)

    • ConfigurableEnvironment自身包含了很多个PropertySource

    PropertySource

    • 属性源

    • 可以理解为很多个Key - Value的属性配置

    由上方的原理图可知,key在最开始出现的PropertySource中的优先级更高,上面的例子在SpringBootusername的值为huan.fu

    3、何时加入我们自己的配置

    由第二步 获取配置属性的优先级 可知,PropertySource 越靠前越先执行,那么要我们配置生效,就必须放在越前面越好。

    So verwenden Sie den EnvironmentPostProcessor von SpringBoot

    由上图可知,SpringBoot加载各种配置是通过EnvironmentPostProcessor来实现的,而具体的实现是ConfigDataEnvironmentPostProcessor来实现的。那么我们自己编写一个EnvironmentPostProcessor的实现类,然后在ConfigDataEnvironmentPostProcessor后执行,并加入到 Environment中的第一位即可。

    So verwenden Sie den EnvironmentPostProcessor von SpringBoot

    四、实现

    1、引入SpringBoot依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.6.6</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.huan.springcloud</groupId>
        <artifactId>springboot-extension-point</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>springboot-extension-point</name>
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    </project>
    Nach dem Login kopieren

    2、在application.properties中配置属性

    vim application.properties
    Nach dem Login kopieren
    username=huan
    Nach dem Login kopieren

    3、编写自定义属性并加入Spring Environment中

    So verwenden Sie den EnvironmentPostProcessor von SpringBoot

    注意:
    1、如果发现程序中日志没有输出,检查是否使用了slf4j输出日志,此时因为日志系统未初始化无法输出日志。解决方法如下:

    SpringBoot版本
    		>= 2.4 可以参考上图中的使用 DeferredLogFactory 来输出日志
    		< 2.4
    			1、参考如下链接 https://stackoverflow.com/questions/42839798/how-to-log-errors-in-a-environmentpostprocessor-execution
    			2、核心代码:
    				@Component
    				public class MyEnvironmentPostProcessor implements
    				        EnvironmentPostProcessor, ApplicationListener<ApplicationEvent> {
    				    private static final DeferredLog log = new DeferredLog();
    				    @Override
    				    public void postProcessEnvironment(
    				            ConfigurableEnvironment env, SpringApplication app) {
    				        log.error("This should be printed");
    				    }
    				    @Override
    				    public void onApplicationEvent(ApplicationEvent event) {
    				        log.replayTo(MyEnvironmentPostProcessor.class);
    				    }
    				}
    Nach dem Login kopieren

    4、通过SPI使自定义的配置生效

    1、在 src/main/resources下新建META-INF/spring.factories文件

    So verwenden Sie den EnvironmentPostProcessor von SpringBoot

    2、配置

    org.springframework.boot.env.EnvironmentPostProcessor=\
      com.huan.springcloud.extensionpoint.environmentpostprocessor.CustomEnvironmentPostProcessor
    Nach dem Login kopieren

    5、编写测试类,输出定义的 username 属性的值

    @Component
    public class PrintCustomizeEnvironmentProperty implements ApplicationRunner {
    
        private static final Logger log = LoggerFactory.getLogger(PrintCustomizeEnvironmentProperty.class);
        @Value("${username}")
        private String userName;
        @Override
        public void run(ApplicationArguments args) {
            log.info("获取到的 username 的属性值为: {}", userName);
        }
    }
    Nach dem Login kopieren

    6、运行结果

    So verwenden Sie den EnvironmentPostProcessor von SpringBoot

    五、注意事项

    1、日志无法输出

    参考上方的 3、编写自定义属性并加入Spring Environment中

    2. Anforderungen

    So verwenden Sie den EnvironmentPostProcessor von SpringBoot
    • < Code> Aus der obigen Abbildung wissen wir, dass unsere Anforderung sehr einfach ist, das heißt, die von uns definierten Eigenschaften müssen eine höhere Priorität haben als die in der Konfigurationsdatei.

      3. Analyse🎜

      1. Wann wir unsere eigenen Konfigurationseigenschaften zu SpringBoot hinzufügen

      🎜Wenn wir Konfigurationseigenschaften in einem Bean verwenden möchten, müssen sich unsere Konfigurationseigenschaften im Bean Put befinden es vor der Instanziierung in Spring und Environment einbinden. Das heißt, unsere Schnittstelle muss vor der Aktualisierung des Anwendungskontexts aufgerufen werden, und EnvironmentPostProcessor kann diese Funktion genau implementieren. 🎜

      2. Die Priorität beim Erhalten von Konfigurationseigenschaften

      🎜Wir wissen, dass es im Frühjahr eine Priorität beim Erhalten von Eigenschaften gibt.
      Zum Beispiel haben wir das folgende Konfigurationsattribut username🎜
      org.springframework.boot.context.logging.LoggingApplicationListener
      Nach dem Login kopieren
      Nach dem Login kopieren
      🎜Was ist also derzeit der Wert von username? Hier leihe ich mir ein Bild von Apollo aus, um dieses Problem zu erklären. 🎜🎜Referenzlink: https://www.apolloconfig.com/#/zh/design/apollo-design🎜🎜So verwenden Sie den EnvironmentPostProcessor von SpringBoot🎜🎜Spring hat seit Version 3.1 ConfigurableEnvironment und PropertySource hinzugefügt: 🎜rrreee🎜🎜🎜Spring ApplicationContext wird eine Umgebung enthalten (die die Schnittstelle „ConfigurableEnvironment“ implementiert)🎜
    • 🎜🎜ConfigurableEnvironment selbst enthält viele PropertySources🎜🎜🎜PropertySource🎜🎜🎜🎜Property Sources🎜 🎜🎜kann als viele Schlüsselwert-Eigenschaftskonfigurationen verstanden werden🎜🎜🎜Wie aus dem obigen schematischen Diagramm ersichtlich ist, erscheint key in der ersten PropertySource Die Priorität ist höher . Im obigen Beispiel ist der Wert von username in SpringBoot huan.fu. 🎜

      3. Wann wir unsere eigene Konfiguration hinzufügen

      🎜Ab dem zweiten Schritt Erhalten Sie die Priorität der Konfigurationseigenschaften können wir sehen, dass die PropertySource höher ist Je höher die Ausführung, desto früher muss unsere Konfiguration wirksam werden. 🎜🎜So verwenden Sie den EnvironmentPostProcessor von SpringBoot🎜🎜Wie Sie aus dem sehen können Bild oben, SpringBoot Das Laden verschiedener Konfigurationen wird durch EnvironmentPostProcessor erreicht, und die spezifische Implementierung wird durch ConfigDataEnvironmentPostProcessor erreicht. Dann schreiben wir selbst eine Implementierungsklasse von EnvironmentPostProcessor, führen sie dann nach ConfigDataEnvironmentPostProcessor aus und fügen sie an der ersten Position in Environment hinzu. 🎜🎜So verwenden Sie den EnvironmentPostProcessor von SpringBoot🎜🎜Vier. Implementierung🎜

      1. Führen Sie SpringBoot-Abhängigkeiten ein

      rrreee

      2. Konfigurieren Sie Eigenschaften in application.properties

      rrreeerreee

      3. Schreiben Sie benutzerdefinierte Eigenschaften und fügen Sie sie zur Spring-Umgebung hinzu

      🎜So verwenden Sie den EnvironmentPostProcessor von SpringBoot🎜🎜Hinweis:
      1 gefunden Es gibt keine Ausgabe im Protokoll. Überprüfen Sie, ob slf4j zur Ausgabe des Protokolls verwendet wird. Das Protokoll kann derzeit nicht ausgegeben werden, da das Protokollsystem nicht initialisiert wurde. Die Lösung lautet wie folgt:🎜rrreee

      4. Sorgen Sie dafür, dass die benutzerdefinierte Konfiguration über SPI wirksam wird.

      🎜1 Erstellen Sie einen neuen src/main/resources< /code> >META-INF/spring.factoriesFile🎜🎜 Verwendung des EnvironmentPostProcessor von SpringBoot🎜🎜2. Konfiguration🎜rrreee

      5. Schreiben Sie eine Testklasse und geben Sie den Wert des definierten Benutzernamenattributs aus

      rrreee

      6. Ergebnisse ausführen

      🎜 So verwenden Sie den EnvironmentPostProcessor von SpringBoot🎜🎜5. Hinweise🎜

      1 . Das Protokoll kann nicht ausgegeben werden.

      🎜Beziehen Sie sich auf die Lösung von 3. Schreiben Sie benutzerdefinierte Attribute und fügen Sie sie zur Spring-Umgebung hinzu. 🎜🎜2. Die Konfiguration wird nicht wirksam, um festzustellen, ob der von @Order oder Ordered zurückgegebene Prioritätswert falsch ist. 🎜
    • 看看别的地方是否实现了 EnvironmentPostProcessor或ApplicationContextInitializer或BeanFactoryPostProcessor或BeanDefinitionRegistryPostProcessor等这些接口,在这个里面修改了 PropertySource的顺序。

    • 理解 Spring 获取获取属性的顺序 参考 2、获取配置属性的优先级

    3、日志系统如何初始化

    如下代码初始化日志系统

    org.springframework.boot.context.logging.LoggingApplicationListener
    Nach dem Login kopieren
    Nach dem Login kopieren

    Das obige ist der detaillierte Inhalt vonSo verwenden Sie den EnvironmentPostProcessor von SpringBoot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Wie Springboot Jasypt integriert, um die Verschlüsselung von Konfigurationsdateien zu implementieren Wie Springboot Jasypt integriert, um die Verschlüsselung von Konfigurationsdateien zu implementieren Jun 01, 2023 am 08:55 AM

    Einführung in Jasypt Jasypt ist eine Java-Bibliothek, die es einem Entwickler ermöglicht, seinem Projekt mit minimalem Aufwand grundlegende Verschlüsselungsfunktionen hinzuzufügen und kein tiefes Verständnis der Funktionsweise der Verschlüsselung erfordert. standardbasierte Verschlüsselungstechnologie. Passwörter, Text, Zahlen, Binärdateien verschlüsseln ... Geeignet für die Integration in Spring-basierte Anwendungen, offene API, zur Verwendung mit jedem JCE-Anbieter ... Fügen Sie die folgende Abhängigkeit hinzu: com.github.ulisesbocchiojasypt-spring-boot-starter2 Die Vorteile von Jasypt schützen unsere Systemsicherheit. Selbst wenn der Code durchgesickert ist, kann die Datenquelle garantiert werden.

    Wie SpringBoot Redisson integriert, um eine Verzögerungswarteschlange zu implementieren Wie SpringBoot Redisson integriert, um eine Verzögerungswarteschlange zu implementieren May 30, 2023 pm 02:40 PM

    Nutzungsszenario 1. Die Bestellung wurde erfolgreich aufgegeben, die Zahlung erfolgte jedoch nicht innerhalb von 30 Minuten. Die Zahlung ist abgelaufen und die Bestellung wurde automatisch storniert. 2. Die Bestellung wurde unterzeichnet und es wurde 7 Tage lang keine Bewertung durchgeführt. Wenn die Bestellung abläuft und nicht ausgewertet wird, wird die Bestellung standardmäßig positiv bewertet. Wenn der Händler die Bestellung innerhalb von 5 Minuten nicht erhält, wird die Bestellung abgebrochen Es wird eine SMS-Erinnerung gesendet ... Für Szenarien mit langen Verzögerungen und geringer Echtzeitleistung können wir die Aufgabenplanung verwenden, um eine regelmäßige Abfrageverarbeitung durchzuführen. Zum Beispiel: xxl-job Heute werden wir auswählen

    So implementieren Sie verteilte Sperren mit Redis in SpringBoot So implementieren Sie verteilte Sperren mit Redis in SpringBoot Jun 03, 2023 am 08:16 AM

    1. Redis implementiert das Prinzip der verteilten Sperren und warum verteilte Sperren erforderlich sind. Bevor über verteilte Sperren gesprochen wird, muss erläutert werden, warum verteilte Sperren erforderlich sind. Das Gegenteil von verteilten Sperren sind eigenständige Sperren. Wenn wir Multithread-Programme schreiben, vermeiden wir Datenprobleme, die durch den gleichzeitigen Betrieb einer gemeinsam genutzten Variablen verursacht werden. Normalerweise verwenden wir eine Sperre, um die Richtigkeit der gemeinsam genutzten Variablen sicherzustellen Die gemeinsam genutzten Variablen liegen im gleichen Prozess. Wenn es mehrere Prozesse gibt, die gleichzeitig eine gemeinsam genutzte Ressource betreiben müssen, wie können sie sich dann gegenseitig ausschließen? Heutige Geschäftsanwendungen sind in der Regel Microservice-Architekturen, was auch bedeutet, dass eine Anwendung mehrere Prozesse bereitstellen muss. Wenn mehrere Prozesse dieselbe Datensatzzeile in MySQL ändern müssen, ist eine Verteilung erforderlich, um fehlerhafte Daten zu vermeiden wird zu diesem Zeitpunkt eingeführt. Der Stil ist gesperrt. Punkte erreichen wollen

    So lösen Sie das Problem, dass Springboot nach dem Einlesen in ein JAR-Paket nicht auf die Datei zugreifen kann So lösen Sie das Problem, dass Springboot nach dem Einlesen in ein JAR-Paket nicht auf die Datei zugreifen kann Jun 03, 2023 pm 04:38 PM

    Springboot liest die Datei, kann aber nach dem Packen in ein JAR-Paket nicht auf die neueste Entwicklung zugreifen. Es gibt eine Situation, in der Springboot die Datei nach dem Packen in ein JAR-Paket nicht lesen kann ist ungültig und kann nur über den Stream gelesen werden. Die Datei befindet sich unter resources publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

    Vergleich und Differenzanalyse zwischen SpringBoot und SpringMVC Vergleich und Differenzanalyse zwischen SpringBoot und SpringMVC Dec 29, 2023 am 11:02 AM

    SpringBoot und SpringMVC sind beide häufig verwendete Frameworks in der Java-Entwicklung, es gibt jedoch einige offensichtliche Unterschiede zwischen ihnen. In diesem Artikel werden die Funktionen und Verwendungsmöglichkeiten dieser beiden Frameworks untersucht und ihre Unterschiede verglichen. Lassen Sie uns zunächst etwas über SpringBoot lernen. SpringBoot wurde vom Pivotal-Team entwickelt, um die Erstellung und Bereitstellung von Anwendungen auf Basis des Spring-Frameworks zu vereinfachen. Es bietet eine schnelle und einfache Möglichkeit, eigenständige, ausführbare Dateien zu erstellen

    So implementieren Sie Springboot+Mybatis-plus, ohne SQL-Anweisungen zum Hinzufügen mehrerer Tabellen zu verwenden So implementieren Sie Springboot+Mybatis-plus, ohne SQL-Anweisungen zum Hinzufügen mehrerer Tabellen zu verwenden Jun 02, 2023 am 11:07 AM

    Wenn Springboot + Mybatis-plus keine SQL-Anweisungen zum Hinzufügen mehrerer Tabellen verwendet, werden die Probleme, auf die ich gestoßen bin, durch die Simulation des Denkens in der Testumgebung zerlegt: Erstellen Sie ein BrandDTO-Objekt mit Parametern, um die Übergabe von Parametern an den Hintergrund zu simulieren dass es äußerst schwierig ist, Multi-Table-Operationen in Mybatis-plus durchzuführen. Wenn Sie keine Tools wie Mybatis-plus-join verwenden, können Sie nur die entsprechende Mapper.xml-Datei konfigurieren und die stinkende und lange ResultMap konfigurieren Schreiben Sie die entsprechende SQL-Anweisung. Obwohl diese Methode umständlich erscheint, ist sie äußerst flexibel und ermöglicht es uns

    Wie SpringBoot Redis anpasst, um die Cache-Serialisierung zu implementieren Wie SpringBoot Redis anpasst, um die Cache-Serialisierung zu implementieren Jun 03, 2023 am 11:32 AM

    1. Passen Sie den RedisTemplate1.1-Standard-Serialisierungsmechanismus an. Die API-basierte Redis-Cache-Implementierung verwendet die RedisTemplate-Vorlage für Daten-Caching-Vorgänge. Öffnen Sie hier die RedisTemplate-Klasse und zeigen Sie die Quellcodeinformationen der Klasse publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations an. Schlüssel deklarieren, verschiedene Serialisierungsmethoden des Werts, der Anfangswert ist leer @NullableprivateRedisSe

    So erhalten Sie den Wert in application.yml in Springboot So erhalten Sie den Wert in application.yml in Springboot Jun 03, 2023 pm 06:43 PM

    In Projekten werden häufig einige Konfigurationsinformationen benötigt. Diese Informationen können in der Testumgebung und in der Produktionsumgebung unterschiedliche Konfigurationen haben und müssen möglicherweise später basierend auf den tatsächlichen Geschäftsbedingungen geändert werden. Wir können diese Konfigurationen nicht fest im Code codieren. Am besten schreiben Sie sie in die Konfigurationsdatei. Sie können diese Informationen beispielsweise in die Datei application.yml schreiben. Wie erhält oder verwendet man diese Adresse im Code? Es gibt 2 Methoden. Methode 1: Wir können den Wert, der dem Schlüssel in der Konfigurationsdatei (application.yml) entspricht, über den mit @Value versehenen Wert erhalten. Diese Methode eignet sich für Situationen, in denen es relativ wenige Mikrodienste gibt: Tatsächlich Projekte, wenn das Geschäft kompliziert ist, Logik

    See all articles