SpringBoot自动装配原理

简介: SpringBoot自动装配原理

SpringBoot自动装配原理

SpringBoot自动装配原理是怎么样的呢,不同的人可能有不同的理解,但作为程序员,最权威的就是看源码了,下面看下springboot相关的源码,理解一下SpringBoot自动装配原理

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
      @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
      @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}

进入SpringBootApplication注解可以看到EnableAutoConfiguration注解

@Enable注解的主要作用把相关组件的Bean装配到IOC容器中

进入EnableAutoConfiguration注解 :

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

   String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

   /**
    * Exclude specific auto-configuration classes such that they will never be applied.
    * @return the classes to exclude
    */
   Class<?>[] exclude() default {};

   /**
    * Exclude specific auto-configuration class names such that they will never be
    * applied.
    * @return the class names to exclude
    * @since 1.3.0
    */
   String[] excludeName() default {};

}

@AutoConfigurationPackage的作用是把使用了该注解的类所在的包和子包下所有的组件扫描到SpringIOC容器中。@Import注解导入了一个AutoConfigurationImportSelector类,AutoConfigurationImportSelector实现配置类的导入

AutoConfigurationImportSelector实现了ImportSelector接口 selectImports方法返回一个String数组,数组中指定需要装配到IOC容器中

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
   if (!isEnabled(annotationMetadata)) {
      return NO_IMPORTS;
   }
   AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
         .loadMetadata(this.beanClassLoader);
   AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
         autoConfigurationMetadata, annotationMetadata);
   return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
  1. AutoConfigurationMetadataLoader.loadMetadata从META-INF/spring-autoconfigure-metadata.properties中加载自动装配的条件元数据,就是只有满足条件的Bean才能够进行装配。
  2. 收集符合条件的配置类autoConfigurationEntry.getConfigurations(),完成自动装配

AutoConfigurationImportSelector中不执行selectImports方法,而是通过ConfigurationClassPostProcessor的processConfigBeanDefinitions方法进行扫描和注册所有配置类的Bean。

protected AutoConfigurationEntry getAutoConfigurationEntry(
      AutoConfigurationMetadata autoConfigurationMetadata,
      AnnotationMetadata annotationMetadata) {
   if (!isEnabled(annotationMetadata)) {
      return EMPTY_ENTRY;
   }
   AnnotationAttributes attributes = getAttributes(annotationMetadata);
   List<String> configurations = getCandidateConfigurations(annotationMetadata,
         attributes);
   configurations = removeDuplicates(configurations);
   Set<String> exclusions = getExclusions(annotationMetadata, attributes);
   checkExcludedClasses(configurations, exclusions);
   configurations.removeAll(exclusions);
   configurations = filter(configurations, autoConfigurationMetadata);
   fireAutoConfigurationImportEvents(configurations, exclusions);
   return new AutoConfigurationEntry(configurations, exclusions);
}
  1. getAttributes获得@EnableAutoConfiguration注解中的属性exclude excludeName等
  2. getCandidateConfigurations获得所有自动装配的配置类
  3. removeDuplicates方法去除重复的配置项
  4. getExclusions方法根据@EnableAutoConfiguration注解中配置的exclude属性,把不需要自动装配的配置类移除。
  5. fireAutoConfigurationImportEvents方法广播事件
  6. 最后返回经过多层判断和过滤之后的配置类集合。

getCandidateConfigurations方法

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
      AnnotationAttributes attributes) {
   List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
         getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
   Assert.notEmpty(configurations,
         "No auto configuration classes found in META-INF/spring.factories. If you "
               + "are using a custom packaging, make sure that file is correct.");
   return configurations;
}

SpringFactoriesLoader扫描classpath下的META-INF/spring.factories文件,根据Key得到对应的value值。

总结:

  1. 通过@Import实现配置类的导入
  2. AutoConfigurationImportSelector类实现ImportSelector接口,重写selectImports方法,用于实现选择性批量配置类的装配
  3. 通过Spring提供的SpringFactoriesLoader机制,扫描classpath路径下的META-INF/spring.factories文件,读取需要实现自动装配的配置类
  4. 通过条件筛选,把不符合条件的配置类移除,最终完成自动装配。

好了 这就是SpringBoot自动装配原理,给大家简简单单的分析了一下,如果你觉得还不错的话,欢迎给大家留言和点赞,大家的赞是对我最大的鼓励,我将继续更文,提升自己的同时分享更多的好文章。

相关文章
|
5天前
|
安全 Java 数据安全/隐私保护
SpringBoot实现二维码扫码登录的原理与详细步骤
SpringBoot实现二维码扫码登录的原理与详细步骤
122 1
|
5天前
|
XML Java 开发者
Spring Boot中的bean注入方式和原理
Spring Boot中的bean注入方式和原理
138 0
|
5天前
|
缓存 Java Maven
Spring Boot自动配置原理
Spring Boot自动配置原理
53 0
|
5天前
|
前端开发 搜索推荐 Java
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革
|
3天前
|
Java 开发者 Spring
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【5月更文挑战第16天】在Spring Boot中,@RequiredArgsConstructor 和 @Lazy 是两个有用的注解,它们分别用于简化构造函数的生成和控制Bean的加载时间。下面详细解析这两个注解的概念、优缺点以及在实际应用中的示例。
9 1
|
5天前
|
XML Java 开发者
springboot 启动原理、启动过程、启动机制的介绍
【5月更文挑战第13天】Spring Boot 是一种基于 Java 的框架,用于创建独立的、生产级别的 Spring 应用程序。它的主要目标是简化 Spring 应用的初始搭建和开发过程,同时提供一系列大型项目常见的非功能性特征(如嵌入式服务器、安全性、度量、健康检查和外部化配置)。
18 3
|
5天前
|
XML Java 数据库
【SpringBoot:详解Bean装配】
【SpringBoot:详解Bean装配】
11 3
|
5天前
|
Java
SpringBoot之@Conditional衍生条件装配详解
SpringBoot之@Conditional衍生条件装配详解
|
5天前
|
Java Spring 容器
SpringBoot自动装配原理之@Import注解解析
SpringBoot自动装配原理之@Import注解解析
55 0
|
5天前
|
JSON Java Maven
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析
45 0
Javaweb之SpringBootWeb案例之 SpringBoot原理的详细解析