Spring Boot自动装配

拼搏现实的明天。 2024-03-22 09:01 111阅读 0赞

目录

是什么?

自动装配的原理

进入@SpringBootApplication注解

点击进入@EnableAutoConfiguration注解

AutoConfigurationImportSelector(核心)

点进getAutoConfigurationEntry()方法:

点进getCandidateConfigurations()

流程图


是什么?

Spring Boot自动装配(Automatic Configuration)是指Spring Boot框架中的一种特性,它可以根据应用程序中的依赖关系和配置来自动配置Spring应用程序的各个部分。在Spring Boot中,自动装配通过使用条件化的配置和智能配置来实现(如:condition),这样可以根据应用程序的环境和需要来自动配置不同的组件,例如spring-boot-starter-redis等。自动装配能够大大减少Spring应用程序的配置量,并且使得应用程序更易于维护和升级。

自动装配的原理

进入@SpringBootApplication注解

其中通过@EnableAutoConfiguration注解实现了自动装配。

  1. @Target({ElementType.TYPE}) // 该注解作用于接口、类、枚举
  2. @Retention(RetentionPolicy.RUNTIME) // 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
  3. @Documented // 有了该注释后,如果有接口使用了该注解,生成的javadoc文件中,会把该注解展示出来
  4. @Inherited // 如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解
  5. @SpringBootConfiguration // 标识它是一个Spring Boot配置类
  6. @EnableAutoConfiguration // 主要是通过这个注解实现自动装配
  7. @ComponentScan( // 配置类上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类
  8. excludeFilters = {@Filter(
  9. type = FilterType.CUSTOM,
  10. classes = {TypeExcludeFilter.class}
  11. ), @Filter(
  12. type = FilterType.CUSTOM,
  13. classes = {AutoConfigurationExcludeFilter.class}
  14. )})
  15. public @interface SpringBootApplication {
  16. 。。。
  17. }

点击进入@EnableAutoConfiguration注解

  1. @Target({ElementType.TYPE}) // 该注解作用于接口、类、枚举
  2. @Retention(RetentionPolicy.RUNTIME) // 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
  3. @Documented // 有了该注释后,如果有接口使用了该注解,生成的javadoc文件中,会把该注解展示出来
  4. @Inherited // 如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解
  5. @AutoConfigurationPackage // 记录使用了该注释的类所在的包以及子包的路径,以便后序读取
  6. @Import({AutoConfigurationImportSelector.class})
  7. public @interface EnableAutoConfiguration{...}

AutoConfigurationImportSelector(核心)

  1. @Override
  2. public String[] selectImports(AnnotationMetadata annotationMetadata) {
  3. if (!isEnabled(annotationMetadata)) {
  4. return NO_IMPORTS;
  5. }
  6. AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
  7. return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
  8. }

点进getAutoConfigurationEntry()方法:

  1. protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
  2. if (!isEnabled(annotationMetadata)) {
  3. return EMPTY_ENTRY;
  4. }
  5. //@EnableAutoConfiguration中的exclude、excludeName等
  6. AnnotationAttributes attributes = getAttributes(annotationMetadata);
  7. //获取所有自动装配的配置类,也就是读取spring.factories文件
  8. List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
  9. //去除重复的配置项。
  10. configurations = removeDuplicates(configurations);
  11. //根据@EnableAutoConfiguration中的exclude、excludeName移除不需要的配置类。
  12. Set<String> exclusions = getExclusions(annotationMetadata, attributes);
  13. checkExcludedClasses(configurations, exclusions);
  14. configurations.removeAll(exclusions);
  15. configurations = getConfigurationClassFilter().filter(configurations);
  16. //广播事件
  17. fireAutoConfigurationImportEvents(configurations, exclusions);
  18. return new AutoConfigurationEntry(configurations, exclusions);
  19. }
  • getAttributes获取@EnableAutoConfiguration中的exclude、excludeName等。
  • getCandidateConfigurations获取所有自动装配的配置类,也就是读取spring.factories文件,后面会再次说明。
  • removeDuplicates去除重复的配置项。
  • getExclusions根据@EnableAutoConfiguration中的exclude、excludeName移除不需要的配置类。
  • fireAutoConfigurationImportEvents 广播事件

点进getCandidateConfigurations()

这里通过loadFactoryNames方法,扫描classpath下的META-INF/spring.factories文件,里面是以key=value形式存储,我们读取其中key=EnableAutoConfiguration,value就是需要装配的配置类,也就是getCandidateConfigurations返回的值。

  1. protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
  2. List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
  3. 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.");
  4. return configurations;
  5. }

流程图

88872d32a87943ddafabef4f5ba71887.png

发表评论

表情:
评论列表 (有 0 条评论,111人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring Boot 自动装配原理

    > 本文已经收录到Github仓库,该仓库包含计算机基础、Java核心知识点、多线程、JVM、常见框架、分布式、微服务、设计模式、架构等核心知识点,欢迎star~ > > G