当前位置: 首页 > 后端技术 > Java

SpringBoot自动装配原理(通俗易懂)

时间:2023-04-01 19:31:27 Java

SpringBoot自动装配原理(通俗易懂)如果你熟练使用SpringBoot,那么掌握自动装配原理是必不可少的。1、什么是SpringBoot自动组装?从META-INF/spring.factories文件中获取对应需要自动组装的类,生成对应的Bean对象,然后交给Spring容器管理。2.启动类注解流程关系分析@SpringBootApplicationpublicclassEntryApplication{publicstaticvoidmain(String[]args){SpringApplication.run(EntryApplication.class,args);}}1。先展示@SpringBootConfiguration注解流程图图TDA["@SpringBootApplication"]A-->B["@SpringBootConfiguration"]A-->C["@EnableAutoConfiguration"]A-->D["@ComponentScan"]C-->E["@AutoConfigurationPackage"]C-->F["@Import(AutoConfigurationImportSelector.class)"]E-->G["@Import(AutoConfigurationPackages.Registrar.class)"]2。代码块显示@SpringBootConfiguration注解流程启动类的@SpringBootAppliation注解是组合注解,由以下三个注解组成@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters={@Filter(type=FilterType.CUSTOM,classes=TypeExcludeFilter.class),@Filter(type=FilterType.CUSTOM,classes=AutoConfigurationExcludeFilter.class)})public@interfaceSpringBootApplication{@EnableAutoConfiguration注解分为以下两个注解@AutoConfigurationPackage@Import(AutoConfigurationPackages.Registrar.class)//将一个组件导入到容器中public@interfaceAutoConfigurationPackage{}//使用Registrar将一系列组件导入到容器中@AutoConfigurationPackage注解由以下注解组成@Import(AutoConfigurationPackages.Registrar.class)public@interface自动配置包{3.注解含义@SpringBootConfiguration:标注在一个类上,表示这是一个SpringBoot配置类;@ComponentScan:配置以注解格式定义的加载bean的扫描路径@EnableAutoConfiguration:开启自动组装功能@AutoConfigurationPackage$\color{#F0F}{指定默认包规则}$是扫描主程序所在的包类所在,并将所有分包下的组件放入Spring容器中;@Import(AutoConfigurationImportSelector.class):通过@Import注解导入AutoConfigurationImportSelector类,然后使用该类的$\color{#F0F}{selectImports}$方法读取MATE中配置的组件的完整类名-INF/spring.factories文件,根据一定的规则过滤掉不符合要求的组件的全类名类名,将剩余读取的组件的全类名集合返回给IOC容器,将这些组件注册为豆三。详细介绍简介1.@AutoConfigurationPackage默认包规则详解2.自动配置@Import(AutoConfigurationImportSelector.class)详解1.使用getAutoConfigurationEntry(annotationMetadata);批量导入一些组件到容器中2.调用Listconfigurations=getCandidateConfigurations(annotationMetadata,attributes)获取所有需要导入到容器中的配置类3.使用工厂加载Map>loadSpringFactories(@NullableClassLoaderclassLoader);获取所有组件4.从META-INF/spring.factories位置加载一个文件默认扫描我们当前系统中位于META-INF/spring.factories中的所有文件**,$\color{#F0F}{根据条件(@Conditional)组装最终会按需配置}$3。当前界面为上图3位置批量导入器界面4.当前方法为上图4位置运行结果4.分析条件组装原理@Conditional1。说到SpringBoot项目最重要的starter场景starter,SpringBoot所有的自动配置功能都在spring-boot-autoconfigure包中,通过哪些场景的自动配置会开启SpringBoot自动组装介绍。2.最重要的控制器(dispatcherServlet)SpringMVC中最重要的控制器(dispatcherServlet)也配置好了。3.文件上传解析器配置@Bean@ConditionalOnBean(MultipartResolver.class)//容器中有该类组件@ConditionalOnMissingBean(name=DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)//容器中没有名为multipartResolver的组件publicMultipartResolvermultipartResolver(MultipartResolverresolver){//对象参数传入到@Bean标记的方法中,这个参数的值会从容器中找到。//SpringMVC多部分解析器。防止部分用户配置的文件上传解析器不符合规范//检测用户是否创建了MultipartResolver但命名错误returnresolver;向容器添加文件上传解析器;以前,在SpringMVC中,要配置文件解析器,名称必须是multipartResolver,但很多人不知道默认行为。SpringBoot可以返回你配置的默认名称的解析器,以防止不符合规范。4.字符集配置5.总结最重要的包spring-boot-autoconfigureSpringBoot默认所有组件都会在底层进行配置。但是如果用户配置了用户的优先级1,为什么不一次性全部加载到容器中呢?如果Spring不加任何附加条件,这时候定义在这些配置类中的bean就会被导入到Spring容器中,非常耗时。记忆,Spring中提供了那么多条件注解,通过它来控制某个配置是否生效。2、小结:项目启动时,SpringBoot框架会自动读取META-INF/spring.factories配置文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration配置的配置类,然后设置其中定义的bean它根据条件注解指定的条件判断是否需要导入到Spring容器中。3、详细总结SpringBoot项目中有一个注解@SpringBootApplication,它封装了三个注解:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan,其中@EnableAutoConfiguration是自动配置的核心注解。该注解通过@Import注解导入AutoConfigurationImportSelector,实现了一个导入器接口ImportSelector。在这个接口中有一个方法selectImports,这个方法的返回值是一个数组,数组中存放着要导入到spring容器中的类的全类名。该方法在AutoConfigurationImportSelector类中被重写,读取项目类路径下META-INF/spring.factories文件中配置类的完整类名。这些配置类中定义的bean会根据条件注解指定的条件来决定是否需要导入到Spring容器中。