0
点赞
收藏
分享

微信扫一扫

springboot的自动装配<1>

艾米吖 2022-04-03 阅读 73
spring boot
我们都知道Springboot是脚手架,意思是我们可以基于Springboot的pom进行快速开发业务以及对应的项目,或者说Springboot提供了基本的开发项目的环境

在这里插入图片描述

在没有Springboot的时候我们需要spring springmvc mybatis 去搭建这个环境,要写很多xml文件
xml文件中 需要配置<bean id class>  意思是将这些类交由Spring容器管理

后来有了java-config 的技术, 意思是我可以@Bean 的形式 取代xml
比如说mybatis,我们可以@Bean sqlsessionfactory 注入一个 sqlsessionfactory ,这样我们就不用写xml文件了~
这样做孙虽然说为我们省去了一些xml配置, 但是还是有很多问题, 比如说框架版本和版本的适配, jar 冲突之类的

Springboot 就用来帮我们解决这些问题 提供了脚手架
帮我们快速搭建一个基于Spring的一个应用程序
为我们解决jar 冲突,框架版本适配 以及@Bean将一些类注入到Spring的ioc 容器中

Springboot就是在Spring的基础上进行构建的,Springboot实际上帮我们配置好了这些bean,管理还是交给了ioc容器处理的

在这里插入图片描述

以前我们要配置 不管是xml,还是config  我们 要配置集成框架的bean,比如说sqlsessionFacotory,以及ViewResolver 交给Spring的ioc容器
springboot的自动装配 其实也是交给了我们的IOC容器

在这里插入图片描述

之前我也说过BeanDefination 是Spring用来描述bean信息的 比如说这个bean是否是懒加载 是否是单例的
我们的@Bean,或者xml配置的目的就是吧我们的类 让spring加载程成beanDefination , 然后再交给ioc ,让Spring来进行管理
----------------------------------------->>>>>>>>

springboot其实也是这样子的~ 但是现在有个问题 
如何批量将一些类成为一些beanDefination, 他有什么方式可以做到批量的注入,@Bean 或者xml似乎是不太可能实现,注意这里是批量{比如说sqlsessonfactory,viewresover }

spring集成任何框架 都是加一个@Enable-------->>@Import
@Import 有三种 比如说
1.@Import(xxx.class)
2.@Import(xxx.class)------->xxx.class 实现了ImportSelector
3.@Import(xxx.class)------xxx.class 实现了ImportBeanDefinitionRegistrar
https://blog.csdn.net/everyok/article/details/81350905 
 可以看看这篇文章是怎么写的~ 讲了3中Import的用法 ~ 之前我也讲过
 
 呢么如果批量注入到springioc中 可以选择这个@ImportSelector 因为 返回的一个数组 可以写很多个

但是 还是这个图 ,比如说我  有增加我bean的扩展性,比如说我
我希望我自己默认配置一个SqlsessionFactory ,如果外部配置了,我就用外部的 如果外部没有配置 我就用默认的配置

在这里插入图片描述

我此时用@ImportSelector 我就没有办法控制顺序的问题,
因为现在要做的是 

在这里插入图片描述

所以我用DeferredImportSelector  这个接口来控制顺序 意思是我先接在@Bean @Import 或者xml配置的 如果你这些配置了 我就用你这些配置的 如果你这些没有配置我就用我默认配置的
启到一个 延迟的作用吧
@ConditionOnBean----->>>>>> 先去我容器当中去找 看你是不是已经有了,如果有了 我就不生效了,
   
但是我们的Springboot 管理的bean 肯定有很多
不可能直接进行写死 ---------------->>>>存储在 spring.factory的文件中,然后进行读取.之后就注册成bean定义
   

在这里插入图片描述

我们来看这个方法  获取自动配置的实体

在这里插入图片描述

在这里插入代码片

在这里插入图片描述
在这里插入图片描述

EnableAutoConfiguration  这个可以自己配置的 第一个看的是这个自己配置的value属性  主要看下一个方法

在这里插入图片描述

他返回一个hashmap的数据结构

在这里插入图片描述

在这里插入图片描述

FACTORIES_RESOURCE_LOCATION  他Spring loadSpringFactories(classLoaderToUse). 这个方法就是加载了
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
所有的spring.factorys 的文件 形成一个map  然后吧这个map放到缓存中了 

在这里插入图片描述

他这个参数就是说  根据我们的注解来选择性注入 BeanDefination	

在这里插入图片描述在这里插入图片描述

	.. 去重操作底层是一个LinkedHashSet
	configurations = 
	removeDuplicates(configurations);
	//根据你的自定义来排除某些jar
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
			//根据你的自定义来删除某些jar
		configurations.removeAll(exclusions);
		configurations = getConfigurationClassFilter().filter(configurations);
		fireAutoConfigurationImportEvents(configurations, exclusions);
		return new AutoConfigurationEntry(configurations, exclusions);
举报

相关推荐

0 条评论