我们都知道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);