Spring的自动装配实现步骤可以理解为两步:加载类,注入类。首先Spring容器启动的时候会扫描Spring配置文件,基于类加载器机制通过配置文件指定的扫包路径批量递归加载类,把加载的类注册成Bean组件放入Spring上下文容器ApplicationContext,这些Bean组件默认是单例的,然后会基于反射读取加载的类中所有标注了自动装配注解的属性,根据注解中指定的需要注入的Bean类型或名称在已经加载的Bean组件中获取对应的Bean,然后给对应属性赋值,从而实现注入。
Spring自动装配有个缺陷,就是对于第三方依赖的包必须手动加入到项目WEB-INF/lib目录下,一个一个Build Path,非常不方便。
SpringBoot简化了Spring加载类的配置流程,尤其是当需要加载大量引入的第三方依赖的时候,由于SpringBoot内置了很多starter组件,这些组件在引入了对spring-boot-starter-parent的父依赖后就可以直接按需引用,SpringBoot对于自带的starter系列组件依赖包命名规范统一都是spring-boot-starter-xxx,通过后缀区分不同功能模块的starter组件,但是对于我们自定义的依赖包命名都要把自定义模块名作为前缀。这样做的目的是,因为SpringBoot应用启动类都会标注@SpringBootApplication注解,这个注解是一个复合注解,等效于@Configuration+@EnableAutoConfiguration+@ComponentScan,@Configuration表示启动类同时也是JavaConfig配置类,@EnableAutoConfiguration会通过AutoConfigurationImportSelector去加载所有starter组件包中的类,每个starter组件包内都生成了META-INF/spring.factories文件,这个文件中定义了当前组件包中所有需要加载到Spring容器的类的全类名,批量加载后会通过AutoConfiguration类自动应用到Spring容器中,@ComponentScan扫描并加载我们自定义的项目中的类,通过指定的包名递归扫描并加载类,如果没有显式指定扫描范围,则默认递归扫描和加载当前启动类同级包目录下的所有类文件,再通过反射自动注入Bean组件到对应的依赖的属性,最终实现自动装配。
Spring自动装配:第三方依赖包必须手动Build Path,自定义的项目中的类直接通过指定包名递归加载和自动装配
SpringBoot自动装配:内置了大量的starter组件,按需引入即可,加载类是通过AutoConfigurationImportSelector把每个starter组件包META-INF/spring.factories文件中生成的全类名直接加载到Spring容器,再通过反射实现自动装配,对于使用者而言,只需要通过一个@SpringBootApplication注解,就帮我们实现了所有第三方依赖的自动装配,然后还可以通过指定scanBasePackage属性扫描和加载我们自定义的类,相比Spring自动装配实现机制而言,极大简化了扫包,加载类,自动装配的实现步骤,非常符合SpringBoot设计理念:更快捷,更简单,更高效搭建Spring生态系统

09-14 22:46