Rumah >Java >javaTutorial >Apakah perbezaan antara SpringBoot application.yml dan bootstrap.yml

Apakah perbezaan antara SpringBoot application.yml dan bootstrap.yml

王林
王林ke hadapan
2023-05-12 17:58:16907semak imbas

SpringBoot menyokong fail konfigurasi dalam dua format: sifat dan YAML secara lalai. Yang pertama mempunyai format yang mudah, tetapi hanya menyokong pasangan nilai kunci. Jika anda perlu menyatakan senarai, sebaiknya gunakan format YAML. SpringBoot menyokong memuatkan fail konfigurasi secara automatik dengan nama yang dipersetujui, seperti application.yml. Jika ia adalah fail konfigurasi dengan nama tersuai, anda perlu mencari kaedah lain. Malangnya, tidak seperti yang pertama yang mempunyai kaedah pemuatan yang mudah seperti @PropertySource, pemuatan yang terakhir mesti dicapai dengan bantuan logik pengekodan.

1. Urutan pelaksanaan bootstrap.yml (bootstrap.properties) dan application.yml (application.properties)

bootstrap.yml (bootstrap.properties) digunakan untuk melaksanakan apabila program boot . Aplikasi Untuk bacaan maklumat konfigurasi awal, contohnya, ia boleh digunakan untuk mengkonfigurasi parameter yang digunakan dalam application.yml, dsb.

application.yml (application.properties) maklumat konfigurasi khusus aplikasi, yang boleh digunakan untuk mengkonfigurasi parameter yang diperlukan dalam modul berikutnya Parameter awam yang digunakan, dsb.

bootstrap.yml dimuatkan sebelum application.yml

2. Senario aplikasi biasa adalah seperti berikut:

  • Apabila menggunakan Spring Cloud Config Server, Anda hendaklah menyatakan spring.application.name dan spring.cloud.config.server.git.uri

  • dan beberapa maklumat penyulitan/penyahsulitan

  • dalam bootstrap.yml

Secara teknikal, bootstrap.yml dimuatkan oleh induk Spring ApplicationContext. Spring ApplicationContext ibu bapa dimuatkan dahulu, sebelum ApplicationContext of application.yml dimuatkan.

Mengapa anda perlu meletakkan maklumat pelayan konfigurasi dalam bootstrap.yml?

Apabila menggunakan Spring Cloud, maklumat konfigurasi biasanya dimuatkan daripada pelayan konfigurasi Untuk mendapatkan maklumat konfigurasi (seperti kata laluan, dll.), anda memerlukan beberapa konfigurasi but awal. Oleh itu, letakkan maklumat pelayan konfigurasi dalam bootstrap.yml untuk memuatkan maklumat konfigurasi yang benar-benar diperlukan dalam tempoh ini.

3. Senario penggunaan lanjutan

Konteks mula

Spring Cloud akan mencipta Konteks Bootstrap sebagai konteks induk bagi Konteks Aplikasi Spring. Semasa permulaan, Konteks Bootstrap bertanggungjawab untuk memuatkan sifat konfigurasi daripada sumber luaran dan konfigurasi penghuraian. Kedua-dua konteks berkongsi Persekitaran yang diperolehi dari luar. Sifat Bootstrap mempunyai keutamaan yang tinggi dan secara lalai ia tidak ditindih oleh konfigurasi setempat. Konteks Bootstrap dan Konteks Aplikasi mempunyai konvensyen yang berbeza, jadi fail bootstrap.yml baharu ditambah dan bukannya application.yml (atau application.properties). Pastikan pemisahan Konteks Bootstrap dan konfigurasi Konteks Aplikasi. Berikut ialah contoh:

bootstrap.yml

spring:
  application:
    name: foo
  cloud:
    config:
      uri: ${SPRING_CONFIG_URI:http://localhost:8888}

Adalah disyorkan untuk mengkonfigurasi spring.application.name dalam bootstrap.yml atau application.yml Anda boleh menetapkan spring.cloud.bootstrap.enabled = palsu untuk melumpuhkan bootstrap.

Hierarki konteks aplikasi

Jika anda mencipta Konteks Aplikasi melalui SpringApplication atau SpringApplicationBuilder, konteks induk Bootstrap Context akan dibuat untuk Konteks Aplikasi aplikasi spring. Terdapat ciri dalam Spring bahawa konteks anak akan mewarisi sumber dan profil sifat kelas induk, jadi konteks aplikasi utama akan menambah sumber sifat tambahan berbanding dengan tidak menggunakan Spring Cloud Config. Sumber sifat tambahan ialah:

  • "bootstrap": Jika PropertySourceLocator diimbas dalam Konteks Bootstrap dan terdapat sifat, ia akan ditambahkan pada CompositePropertySource. Spirng Cloud Config menambah sifat dengan cara ini Lihat kod sumber ConfigServicePropertySourceLocator` untuk mendapatkan butiran. Terdapat juga contoh penyesuaian di bawah.

  • "applicationConfig: [classpath:bootstrap.yml]" , (jika terdapat spring.profiles.active=production maka contohnya applicationConfig: [classpath:/bootstrap.yml]#production ): Jika anda menggunakan bootstrap.yml untuk mengkonfigurasi Konteks Bootstrap, ia mempunyai keutamaan yang lebih rendah daripada application.yml. Ia akan ditambahkan pada konteks kanak-kanak sebagai sebahagian daripada aplikasi Spring Boot. Diperkenalkan di bawah.

Disebabkan peraturan keutamaan, Konteks Bootstrap tidak mengandungi data daripada bootstrap.yml, tetapi ia boleh digunakan sebagai tetapan lalai.

Anda boleh melanjutkan mana-mana hierarki konteks yang anda buat dengan mudah dengan menggunakan antara muka yang disediakannya atau menggunakan kaedah yang disertakan dalam SpringApplicationBuilder (ibu bapa(), anak(), adik beradik()). Konteks Bootstrap akan menjadi kelas induk tahap tertinggi. Setiap Konteks lanjutan mempunyai sumber sifat bootstrap sendiri (yang mungkin kosong). Setiap Konteks lanjutan mempunyai spring.application.name yang berbeza. Pada dasarnya, konteks ibu bapa-anak pada tahap yang sama juga mempunyai nama yang berbeza, dan oleh itu, akan terdapat juga konfigurasi Pelayan Konfig yang berbeza. Sifat konteks kanak-kanak akan mengatasi konteks induk jika mereka mempunyai nama yang sama.

Perhatikan bahawa SpringApplicationBuilder membenarkan perkongsian Persekitaran ke semua peringkat, tetapi bukan secara lalai. Oleh itu, konteks adik beradik pada tahap yang sama tidak semestinya mempunyai profil atau sumber harta yang sama apabila mereka tidak berkongsi sesuatu dengan kelas induk.

Ubah suai konfigurasi atribut Bootstrap

Lokasi kod sumber BootstrapApplicationListener.

   String configName = environment.resolvePlaceholders("${spring.cloud.bootstrap.name:bootstrap}");

    String configLocation = environment.resolvePlaceholders("${spring.cloud.bootstrap.location:}");

    Map<String, Object> bootstrapMap = new HashMap<>();bootstrapMap.put("spring.config.name",configName);
    if(StringUtils.hasText(configLocation)){
        bootstrapMap.put("spring.config.location", configLocation);
    }

bootstrap.yml是由spring.cloud.bootstrap.name(默认:”bootstrap”)或者spring.cloud.bootstrap.location(默认空)。这些属性行为与spring.config.*类似,通过它的Environment来配置引导ApplicationContext。如果有一个激活的profile(来源于spring.profiles.active或者Environment的Api构建),例如bootstrap-development.properties 就是配置了profile为development的配置文件.

覆盖远程属性

property sources被bootstrap context 添加到应用通常通过远程的方式,比如”Config Server”。默认情况下,本地的配置文件不能覆盖远程配置,但是可以通过启动命令行参数来覆盖远程配置。如果需要本地文件覆盖远程文件,需要在远程配置文件里设置授权
spring.cloud.config.allowOverride=true(这个配置不能在本地被设置)。一旦设置了这个权限,你可以配置更加细粒度的配置来配置覆盖的方式,

比如:

  • spring.cloud.config.overrideNone=true 覆盖任何本地属性

  • spring.cloud.config.overrideSystemProperties=false 仅仅系统属性和环境变量
    源文件见PropertySourceBootstrapProperties

自定义启动配置

bootstrap context是依赖/META-INF/spring.factories文件里面的org.springframework.cloud.bootstrap.BootstrapConfiguration条目下面,通过逗号分隔的Spring @Configuration类来建立的配置。任何main application context需要的自动注入的Bean可以在这里通过这种方式来获取。这也是ApplicationContextInitializer建立@Bean的方式。可以通过@Order来更改初始化序列,默认是”last”。

# spring-cloud-context-1.1.1.RELEASE.jar
# spring.factories
# AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshAutoConfiguration,\
org.springframework.cloud.autoconfigure.RefreshEndpointAutoConfiguration,\
org.springframework.cloud.autoconfigure.LifecycleMvcEndpointAutoConfiguration

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.cloud.bootstrap.BootstrapApplicationListener,\
org.springframework.cloud.context.restart.RestartListener

# Bootstrap components
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration,\
org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration,\
org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration

警告

小心,你添加的自定义BootstrapConfiguration类没有错误的@ComponentScanned到你的主应用上下文,他们可能是不需要的。使用一个另外的包不被@ComponentScan或者@SpringBootApplication注解覆盖到。

bootstrap context通过spring.factories配置的类初始化的所有的Bean都会在SpingApplicatin启动前加入到它的上下文里去。

自定义引导配置来源:Bootstrap Property Sources
默认的property source添加额外的配置是通过配置服务(Config Server),你也可以自定义添加property source通过实现PropertySourceLocator接口来添加。你可以使用它加配置属性从不同的服务、数据库、或者其他。

下面是一个自定义的例子:

@Configuration
public class CustomPropertySourceLocator implements PropertySourceLocator {

    @Override
    public PropertySource<?> locate(Environment environment) {
        return new MapPropertySource("customProperty",
                Collections.<String, Object>singletonMap("property.from.sample.custom.source", "worked as intended"));
    }
}

Environment被ApplicationContext建立,并传入property sources(可能不同个profile有不同的属性),所以,你可以从Environment寻找找一些特别的属性。比如spring.application.name,它是默认的Config Server property source。

如果你建立了一个jar包,里面添加了一个META-INF/spring.factories文件:

org.springframework.cloud.bootstrap.BootstrapConfiguration=sample.custom.CustomPropertySourceLocator

那么,”customProperty“的PropertySource将会被包含到应用。

Atas ialah kandungan terperinci Apakah perbezaan antara SpringBoot application.yml dan bootstrap.yml. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam