日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

springBoot自動裝配的原理

作者:l1050188952 更新時間: 2022-09-25 編程語言

????????Spring Boot是由Pivotal團隊提供的框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進行配置,(自動裝配)使我們在開發(fā)中不再需要定義樣板化的配置(xml文件)。

? ? ? ? spring boot框架的核心注解:

@Configuration ?用于聲明定義bean,定義為配置類。作用在類上面。這也是springboot自動裝配關(guān)鍵的注解之一 其實就是平常Spring配置文件中我們寫的bean?

@EnableAutoConfiguration 用來開啟springboot自動配置的注解,這個也是自動裝配中很重要的注解

@ConfigurationProperties ?用來讀取配置文件并封裝成實體類

@EnableConfigurationProperties 這個一般要配合@ConfigurationProperties使用可以使??@ConfigurationProperties封裝成的實體類成功注入

我們單看spring boot的啟動類只能看到一個注解@SpringBootApplication,什么也看不到,所以要進注解中詳細分析。

?
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//用于定于Bean,springboot的啟動類其實也就是作為spring的一個bean注入到spring容器中。
@SpringBootConfiguration
//開啟自動裝配的核心注解
@EnableAutoConfiguration
//主要就是定義掃描的路徑從中找出標識了需要裝配的類自動裝配到spring的bean容器中
@ComponentScan(excludeFilters = {
  @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
  @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
....
}

?

@EnableAutoConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration{

    String ENABLED OVERRIDE PROPERTY = "spring.boot.enableautoconfiguration"
    Class<?>[] exclude() default {};
    String[] excludeName() default {}; 
}

其中,@AutoConfigurationPackage 添加該注解的類所在的package 作為 自動配置package 進行管理,我查詢了一下,叫自動裝配包

@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Documented
@java.lang.annotation.Inherited
@org.springframework.context.annotation.Import({
org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar.class})
public @interface AutoConfigurationPackage {
    java.lang.String[] basePackages() default {};
 
    java.lang.Class<?>[] basePackageClasses() default {};
}

上一個注解我們把所有組件都加載到了容器里面,這個注解就是將需要自動裝配的類以全類名的方式返回,從而@Import({AutoConfigurationImportSelector.class})將Bean注入spring容器 ?而這個導入的類的作用可以幫助將所有符合條件的@Configuration配置交給spring的IOC容器進行注入。

 @Override
  public void registerBeanDefinitions(AnnotationMetadata metadata,
    BeanDefinitionRegistry registry) {
   register(registry, new PackageImport(metadata).getPackageName());
  }

那是怎么找到哪些是需要自動裝配的類呢

AutoConfigurationImportSelector這個類里面有一個方法selectImports(),如下

@Override
public string[] selectImports(AnnotationMetadata annotationMetadata) {

if (!isEnabled(annotationMetadata)){
 return No_IMPORTS; 
 } 
 AutoConfiqurationEntry autoConfiqurationEntry getAutoConfiqurationEntry(annotationMetadata) 
return stringUtils.toStringArray(autoConfiqurationEntry.getconfiqurations(); 
}

getCandidateConfigurations()方法里面調(diào)用了-->loadFactoryNames()方法,再調(diào)用-->loadSpringFactories()方法

public static List<string> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) 
  String factoryTypeName =factoryType.getName();
 
  return loadSpringFactories(classLoader) 


getorDefault(factoryTypeName,Collections.emptyList()); 
  }

關(guān)鍵就在這個loadSpringFactories()方法里面,在這個方法里,它會查找所有在META-INF路徑下的spring.factories文件-->在META-INF/spring.factories這個文件里面的數(shù)據(jù)是以鍵=值的方式存儲,然后解析這些文件,找出以EnableAutoConfiguration為鍵的所有值,以列表的方式返回。

大致流程如下:


@SpringBootApplication等同于下面三個注解(作用點):

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中@EnableAutoConfiguration是關(guān)鍵(啟用自動配置),內(nèi)部實際上就去加載META-INF/spring.factories文件的信息,然后篩選出以EnableAutoConfiguration為key的數(shù)據(jù),加載到IOC容器中,實現(xiàn)自動配置功能。

原文鏈接:https://blog.csdn.net/l1050188952/article/details/126339271

欄目分類
最近更新