目录
自动装配的核心-----@SpringBootApplication
@Import(EnableAutoConfigurationImportSelector.class)(最核心)
SpringBoot自动装配
自动装配基于约定优于配置的原则,通过自动检测和配置类来自动配置应用程序所需的各种组件、库和功能。
约定优于配置的主要特点和优势
- 简化配置:我们可以直接使用SpringBoot默认提供好的配置,无需自己再进行定义整合,比如之前的Spring的配置文件,SpringMvc的配置文件等,这样就减少了繁琐和重复的配置代码,从而达到简化配置
- 开发者友好:通过遵循约定,开发人员可以更快地上手项目,开发者不再需要解释和配置复杂的参数和选项,也可以提高开发效率
- 内嵌式容器:应用程序中直接嵌入一个Servlet容器,而不需要外部部署或配置独立的Servlet容器
- 默认配置文件:SpringBoot的默认配置文件是
application.properties、application.yml或者application.yaml,
这些配置文件可以放置在项目根目录下的src/main/resources
目录中。Spring Boot会自动读取这些配置文件,并根据其中的配置内容进行相应的应用程序配置。
自动装配的核心-----@SpringBootApplication
@SpringBootApplication注解是SpringBoot启动类上的一个注解
进入注解中可以看到
除了其他用来修饰注解所需要的注解,还有三个核心注解@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
@SpringBootConfiguration
点进去跟进
发现他有@Configuration注解,应该就能猜到,@SpringBootConfiguration这个注解的功能就是把一个类设置为配置类交给Spring容器管理
@ComponentScan
这个注解的功能是自动扫描该配置类所在的包及其子包,并将标记为组件注解的类(那些标记了@Service,@Controller等)实例化并注册为Spring容器中的Bean,并且还可以通过basePackages等属性来规定扫描的范围
这样SpringBootApplication注解中就有这样两个属性用来指定扫描的包或者类
@EnableAutoConfiguration(核心)
这个是SpringBoot最为核心的一个注解
跟进注解 发现有这两个注解
@AutoConfigurationPackage
继续跟进
@Import用于导入其他配置类或者组件类。它可以被用来在一个配置类中引入其他配置类,以便将它们的配置信息合并到当前的配置中。它的作用,就是注册启动类所在的包和其子包下的所有组件
跟进Registrar.Class
这个类用于注册Bean定义到Spring容器中。在这里,registerBeanDefinitions方法通过PackageImports类获取到注解元数据中的包名,并将这些包名作为参数调用register方法进行注册
PackageImports类
这段代码的目的是从注解元数据中提取出基础包名信息,之前配置的扫描包路径,在这里也应该明白了
register方法
这段代码的目的是在注册容器中注册指定的基础包名,以供后续的处理和配置使用。
@Import(EnableAutoConfigurationImportSelector.class)(最核心)
借助 EnableAutoConfigurationImportSelector,@EnableAutoConfiguration 可以帮助 SpringBoot 应用将所有符合条件的 @Configuration 配置都加载到当前 SpringBoot 创建并使用的 IoC 容器
跟进EnableAutoConfigurationImportSelector代码看看如何加载到的
类中有一个getAutoConfigurationEntry方法,接受一个注解元数据作为参数
跟进这个方法
这段字符串的意思大概是在 META-INF/spring.factory 和
META- INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中找不到自动配置类。如果您使用的是自定义打包,请确保该文件正确无误
看Assert提示的参数能猜到,上面的SpringFactoriesLoader.loadFactoryNames和ImportCandidates.load这两个方法就是来加载配置META—INF下的配置文件的
调用
SpringFactoriesLoader.loadFactoryNames()
方法,加载指定类加载器下META-INF/spring.factories
文件中的配置类名。这些配置类名是通过getSpringFactoriesLoaderFactoryClass()
方法获取的,该方法可以由子类进行实现和定制
通过获取工厂类型的全限定名 factoryTypeName。 调用 loadSpringFactories() 方法加载类加载器中的 META-INF/spring.factories 文件,并返回一个 Map<String, List<String>> 类型的结果。该结果是一个映射,其中键是工厂类型的全限定名,值是在 spring.factories 文件中找到的相关工厂名列表
如何拿到配置文件呢
调用类加载器的 getResources() 方法加载指定资源路径下的所有资源,并返回一个 Enumeration 对象。该资源路径是 META-INF/spring.factories
再看一下ImportCandidates.load方法
其中 %s
是一个占位符,表示在具体使用时将被替换为某个值,也就对应上了META-INF/spring/下符合条件的imports文件,使用时会被替换为全限定名。
具体来说,@EnableAutoConfiguration会根据你的项目中所引入的依赖自动配置Spring应用程序。所以就不需要手动配置太多的东西,Spring Boot会根据你的程序的所使用的依赖自动配置好基本的配置,例如:数据源、日志、Web MVC等。@EnableAutoConfiguration使用Spring Boot的条件化配置特性。它根据应用程序中的依赖和配置确定需要配置哪些组件。这样可以大大简化Spring应用程序的配置过程,并提高开发效率。