手撕JAVA(二十八)@conditional

在《手撕JAVA(八)》一文中已经讨论过springboot的自动装配原理,其实本质上就是由XXXConfiguration这些自动配置类来完成我们所需要的类的自动加载。但是springboot整合了整个J2EE,如果整个J2EE所需要的类全部加载,那么肯定是内存撑爆,速度迟缓。所以springboot采用了@conditional注解来做判断加载。只在满足特定的情况下才加载特定的类。

以下是conditional系列注解对应的作用:

手撕JAVA(二十八)@conditional

这里以mybatis的自动配置类源码来举例:

整个类名前面一堆注解,其实就是对这个自动配置类做了判断加

1.系统中必须有SqlsessionFactory.class,SqlSessionFactoryBean.class该配置类才会加载

2.容器中必须有DataSource类

3.绑定MybatisProperties.class作为配置文件类

4.在DataSourceAutoConfiguration.class加载后再加载

需要注意的是这里的.class是类型标记

其实仔细思考会发现持久层框架的自动配置类都依赖于dataSource,

但是在dataSource的自动配置类里面确实missingBean

就是这种设计给了我们自定义dataSource的机会,也就有了之前切换druid之类的操作机会。

手撕JAVA(二十八)@conditional

 

如何查看加载了哪些东西?

在springboot配置文件里

Debug=true

启动项目后

手撕JAVA(二十八)@conditional