Pusat konfigurasi Apollo
telah digunakan dalam projek sebelumnya Selepas dok dengan pusat konfigurasi Apollo, sifat konfigurasi pusat boleh dipaparkan dalam program Digunakan, jadi bagaimana ini dicapai? Bilakah sifat pusat konfigurasi dimuatkan ke dalam program? Jadi jika kita mengetahui bagaimana ini dilaksanakan, bolehkah kita 从任何地方加载配置属性
, 配置属性的加解密功能呢
?
从上图中得知,我们的需求很简单,即我们自己定义的属性需要比配置文件中的优先级更高。
Apabila kita ingin menggunakan sifat konfigurasi dalam Kacang, maka sifat konfigurasi kita mesti dimasukkan ke dalam Spring ke dalam Persekitaran sebelum Kacang dijadikan instantiated. Iaitu, antara muka kami perlu dipanggil sebelum application context refreshed
, dan EnvironmentPostProcessor
boleh melaksanakan fungsi ini dengan tepat.
Kami tahu bahawa terdapat keutamaan untuk mendapatkan sifat dalam Spring.
Sebagai contoh, kami mempunyai atribut konfigurasi berikut username
├─application.properties │ >> username=huan ├─application-dev.properties │ >> username=huan.fu
Jadi apakah nilai username
pada masa ini? Di sini saya meminjam gambar daripada Apollo
untuk menjelaskan masalah ini.
Pautan rujukan: https://www.apolloconfig.com/#/zh/design/apollo-design
Spring telah ditambah sejak versi 3.1 ConfigurableEnvironment
dan PropertySource
:
ConfigurableEnvironment
Spring's ApplicationContext akan mengandungi Persekitaran (melaksanakan antara muka ConfigurableEnvironment)
ConfigurableEnvironment itu sendiri mengandungi many masing-masing PropertySource
PropertySource
PropertySource
boleh difahami sebagai banyak Kunci - Atribut nilai konfigurasi
Seperti yang dapat dilihat daripada rajah skema di atas, key
mempunyai keutamaan yang lebih tinggi dalam PropertySource
yang pertama Contoh di atas adalah dalam SpringBoot
< Nilai 🎜 > ialah username
. huan.fu
kita dapat melihat bahawa 获取配置属性的优先级
dilaksanakan terlebih dahulu, jadi untuk konfigurasi kita berkuat kuasa, ia mestilah diletakkan Lebih jauh ke hadapan, lebih baik. PropertySource
, dan pelaksanaan khusus dicapai oleh EnvironmentPostProcessor
. Kemudian kita tulis kelas pelaksanaan ConfigDataEnvironmentPostProcessor
diri kita sendiri, kemudian laksanakan selepas EnvironmentPostProcessor
dan tambahkannya pada kedudukan pertama dalam ConfigDataEnvironmentPostProcessor
. Environment
<?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>
Nota: 1 Jika anda mendapati tiada keluaran log dalam program, semak sama ada anda telah menggunakan
Keluarkan log Pada masa ini, log tidak boleh dikeluarkan kerana sistem log belum dimulakan.vim application.properties
slf4j
4 Jadikan konfigurasi tersuai berkuat kuasa melalui SPI解决方法如下:
1 Cipta fail src/main/resources
META-INF/spring.factories
<🎜. >
username=huan
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); } }
6 🎜>
5. Nota 1 Log tidak boleh dikeluarkan Rujuk penyelesaian yang disediakan olehdi atas.
2. Pastikan konfigurasi tidak berkuat kuasa Semak keutamaan EnvironmentPostProcessor untuk melihat sama ada nilai keutamaan yang dikembalikan oleh @Order atau Ordered adalah salah.看看别的地方是否实现了 EnvironmentPostProcessor或ApplicationContextInitializer或BeanFactoryPostProcessor或BeanDefinitionRegistryPostProcessor等这些接口,在这个里面修改了 PropertySource的顺序。
理解 Spring 获取获取属性的顺序 参考 2、获取配置属性的优先级
如下代码初始化日志系统
org.springframework.boot.context.logging.LoggingApplicationListener
Atas ialah kandungan terperinci Cara menggunakan EnvironmentPostProcessor SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!