什么是 SpringBoot 自动装配?
SpringBoot的自动装配是指SpringBoot会自动将一些配置类的bean注册到IOC容器中,我们可以在需要的地方使用@Autowired或@Resource等注解来使用它。SpringBoot定义了一套接口规范,这套规范规定:SpringBoot在启动时会扫描外部引用jar包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到Spring容器并执行类中定义的各种操作。
自动装配可以简单理解为:通过注解或者一些简单的配置就能在SpringBoot的帮助下实现某块功能。这样就可以更快速地构建应用程序,而无需手动配置大量的bean。
上边描述说了springBoot启动的时候会扫描META-META-INF/spring.factories文件,那这个文件到底是干什么的。
Spring Factories
在Spring Boot中有一种非常解耦的扩展机制:Spring Factories。它允许开发人员在META-INF/spring.factories文件中配置接口的实现类名称,然后在程序中读取这些配置文件并实例化。这种机制类似于Java的SPI机制,可以用来实现模块化和可扩展性。
Spring Factories机制的底层实现是基于SpringFactoriesLoader类。这个类会在程序启动时检索ClassLoader中所有jar包(包括ClassPath下的所有模块)引入的META-INF/spring.factories文件,然后基于文件中的接口(或者注解)加载对应的实现类并且注册到IOC容器。
Spring Boot也使用了Spring Factories机制来实现自动装配。当Spring Boot应用程序中使用@EnableAutoConfiguration注解时,Spring Boot会自动检索所有jar包中的META-INF/spring.factories文件,并根据其中配置的自动装配类来创建相应的bean。
为什么要有Spring Factories机制
首先思考一个问题,「如果Bean的路径不再Spring Boot 项目的扫描路径下,那该怎么办呢?」
我们通常的做法:
-
使用 @ComponentScan
注解:可以在Spring Boot的主类或者某个配置类上使用@ComponentScan
注解,来指定Spring应该扫描哪些包。 -
手动注册Bean。 -
使用@import注解。
对于传统的方式,我们需要在Spring Boot项目中明确指定并管理外部包的相关逻辑,这增加了外部包和Spring Boot项目之间的紧耦合关系。而实际上,我们更希望能够做到"开