Rumah  >  Artikel  >  Java  >  Apakah prinsip pelaksanaan konfigurasi automatik SpringBoot?

Apakah prinsip pelaksanaan konfigurasi automatik SpringBoot?

WBOY
WBOYke hadapan
2023-05-15 15:58:065238semak imbas

1. Apakah konfigurasi automatik springboot

SpringBoot menghidupkan konfigurasi automatik melalui anotasi @EnableAutoConfiguration dan mengimbas fail spring.factories di bawah pakej balang syarat yang ditentukan oleh anotasi @Condition dipenuhi, ia akan digunakan dengan sokongan kebergantungan dan didaftarkan dalam bekas Spring.

Untuk meletakkannya dalam istilah orang awam, apabila kami menulis projek ssm sebelum ini, kami mengkonfigurasi banyak koordinat dan kandungan konfigurasi Proses menyediakan persekitaran mengambil banyak masa dalam pembangunan projek ciri terbesar SpringBoot ialah ia memudahkan pelbagai kandungan konfigurasi xml, jadi konfigurasi automatik springboot menggunakan anotasi untuk membuat konfigurasi lalai untuk beberapa konfigurasi konvensional, memudahkan kandungan konfigurasi xml supaya projek anda boleh berjalan dengan cepat.

Prinsip konfigurasi teras Springboot:

  • Kelas konfigurasi automatik disimpan dalam org.springframework.boot.autoconfigure di bawah spring-boot-autoconfigure-version number.jar

  • Mulakan bekas apabila kami mengkonfigurasi debug=true dalam application.properties. Anda boleh melihat konfigurasi awal permulaan pelayan

  • Pengawal bahagian hadapan berdaftar DispatcherServletAutoConfigratio

  • EmbeddedServletContainerAutoConfiguration jenis bekas berdaftar

  • 2. Komponen pemula

  • Komponen pemula ialah kebergantungan Maven yang boleh dimuatkan dalam item permohonan. Hanya dengan menambahkan konfigurasi kebergantungan yang sepadan dalam konfigurasi Maven anda boleh menggunakan komponen Starter yang sepadan. Sebagai contoh, menambah kebergantungan spring-boot-starter-web boleh digunakan untuk membina perkhidmatan API REST, yang merangkumi bekas terbenam Spring MVC dan Tomcat.
  • Komponen Pemula yang lengkap merangkumi dua perkara berikut:

Modul konfigurasi automatik yang menyediakan fungsi konfigurasi automatikApakah prinsip pelaksanaan konfigurasi automatik SpringBoot?

Menyediakan dependencies Modul komponen fungsi pos pengurusan perhubungan merangkumi semua fungsi komponen dan boleh digunakan di luar kotak.

spring-boot-starter-web bergantung pada kod sumber
    package org.springframework.boot.autoconfigure.web.servlet;
    @Configuration
    @ConditionalOnClass({ServletRequest.class})
    @ConditionalOnWebApplication(
        type = Type.SERVLET
    )
    @EnableConfigurationProperties({ServerProperties.class})
    @Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class})
    public class ServletWebServerFactoryAutoConfiguration {
        ......
    }
    @
  • 3 Tiga anotasi utama

    @SpringBootConfiguration: Diwarisi daripada Konfigurasi, menyokong. Kaedah JavaConfig untuk mengkonfigurasi.
  • @EnableAutoConfiguration: Artikel ini memfokuskan pada penjelasan, terutamanya digunakan untuk mendayakan konfigurasi automatik.

    @ComponentScan: Imbas komponen secara automatik Secara lalai, semua kelas dengan anotasi yang ditentukan di bawah pakej dan subpakej kelas diimbas dan ia secara automatik dipasang ke dalam bekas kacang dipasang termasuk @Controller , @Service, @Component, @Repository, dsb. Laluan imbasan juga boleh ditentukan.
4. @EnableAutoConfiguration

Anotasi ini membantu kami memuatkan konfigurasi lalai secara automatik. Ia mempunyai dua anotasi utama @AutoConfigurationPackage dan @Import.

@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		//检查自动配置功能是否开启,默认开启
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		//加载自动配置的元信息
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		//获取候选配置类
		List<String> configurations = getCandidateConfigurations(annotationMetadata,
				attributes);
		//去掉重复的配置类
		configurations = removeDuplicates(configurations);
		//获得注解中被exclude和excludeName排除的类的集合
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		//检查被排除类是否可实例化、是否被自动注册配置所使用,不符合条件则抛出异常
		checkExcludedClasses(configurations, exclusions);
		//从候选配置类中去除掉被排除的类
		configurations.removeAll(exclusions);
		//过滤
		configurations = filter(configurations, autoConfigurationMetadata);
		//将配置类和排除类通过事件传入到监听器中
		fireAutoConfigurationImportEvents(configurations, exclusions);
		//最终返回符合条件的自动配置类的全限定名数组
		return StringUtils.toStringArray(configurations);

@Import(AutoConfigurationImportSelector.class) anotasi, import kelas AutoConfigurationImportSelector di sini. Terdapat kaedah yang sangat penting dalam kelas ini - selectImports(), yang merangkumi hampir semua logik pemprosesan pemasangan automatik komponen, termasuk mendapatkan kelas konfigurasi calon, penyahduplikasian kelas konfigurasi, tidak termasuk kelas konfigurasi yang tidak perlu, penapisan, dsb. Akhir sekali, tatasusunan sepenuhnya nama yang layak bagi kelas yang dikonfigurasikan secara automatik yang memenuhi syarat dikembalikan.

5. SpringFactoriesLoader

Kelas SpringFactoriesLoader ditakrifkan dalam pakej spring-core Kelas ini melaksanakan fungsi mendapatkan semula fail META-INF/spring.factories dan mendapatkan konfigurasi yang ditentukan. antara muka. Dua kaedah luaran ditakrifkan dalam kelas ini:

loadFactories memperoleh contoh kelas pelaksanaannya berdasarkan kelas antara muka Kaedah ini mengembalikan senarai objek.

loadFactoryNames mendapat nama kelas antara muka berdasarkan antara muka Kaedah ini mengembalikan senarai nama kelas.

Kunci kepada dua kaedah di atas ialah mendapatkan fail spring.factories daripada ClassLoader yang ditentukan dan menghuraikannya untuk mendapatkan senarai nama kelas Kod khusus adalah seperti berikut:
    public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
        String factoryClassName = factoryClass.getName();
        try {
            Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
                    ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
            List<String> result = new ArrayList<String>();
            while (urls.hasMoreElements()) {
                URL url = urls.nextElement();
                Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
                String factoryClassNames = properties.getProperty(factoryClassName);
                result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
            }
            return result;
        }
        catch (IOException ex) {
            throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
                    "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
        }
    }
  • Ia boleh dilihat daripada kod bahawa dalam kaedah ini, fail spring.factories di bawah semua pakej balang dalam keseluruhan ClassLoader akan dilalui. Dalam erti kata lain, kita boleh mengkonfigurasi fail spring.factories dalam balang kita sendiri tanpa menjejaskan konfigurasi di tempat lain atau ditimpa oleh konfigurasi orang lain.

    spring.factories diperoleh melalui analisis Properties, jadi kandungan dalam fail yang kami tulis dipasang dan dikonfigurasikan dengan cara berikut:
  • com.xxx.interface= com.xxx .nama kelas

Atas ialah kandungan terperinci Apakah prinsip pelaksanaan konfigurasi automatik SpringBoot?. 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