springboot提倡: 约定大于配置
springboot最常见的面试题:
1.springboot是如何实现自动加载配置呢?
2.如何写一个starter呢?
带着问题,我们以mybatis-spring-boot-starter为例,看一下,Starter如何写,然后SpringBoot又是如何加载的.
1.引入
在springboot项目中引入mybatis是很简单的,只需要配置一个依赖.
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.封装
看一下包里的内容:
(1)
会带过过来mybatis依赖的jar包,表现就是我们自己的pom只需要mybatis-springboot-starter这个pom配置就可以.它自己的pom会带过来其他jar包依赖.
(2) (3)
这里2,3 是配合使用的,在/META-INF/spring.factories中会有一个这个配置:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
这个配置对应的就是(3)里面的类.
咱们看一下这个MybatisAutoConfiguration类里都配置了什么东西.
是不是看到了一些久违的东西,早起我们自己使用spring项目的时候需要我们自己配置的东西,Datasource,SqlSessionFactory.其实在这已经提前替我们配置好了,剩下的只是一些需要我们自己填的,比如数据源驱动类型,url,user,password,连接数等等…
使用一下注释可以配置自己定义的AutoConfig
@ConditionalOnBean:当容器中有指定的Bean的条件下
@ConditionalOnClass:当类路径下有指定的类的条件下
@ConditionalOnMissingBean:当容器中没有指定Bean的情况下
@ConditionalOnMissingClass:当类路径下没有指定的类的条件下.
3.加载
1.springboot启动的时候使用的是启动类中的main方法.在启动类上有一个@SpringBootApplication注解.
2.看一下内部它的内部构成:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CTHBNubv-
这里注意这个@EnableAutoConfiguration,有没有想到我们之前在spring.factories中配置的东西.
3.@EnableAutoConfiguration中的内容
AutoConfigurationImportSelector是实现配置自动加载的关键.
在这里有一个重要的东西SpringFactoriesLoader类加载器,他会查找org.springframework.boot.autoconfigure.EnableAutoConfiguration关键字对应的配置文件,就像我们之前mybatis-spring-boot-starter中看到的.
SpringFactoriesLoader会自动加载/META-INF/spring.factories中.EnableAutoConfiguration对应的,AutoConfig类.实现配置的自动加载到IOC中.
眼见为实:
项目启动后,SpringFactoriesLoader加载的所有配置类,其中就包含了MybatisAutoConfiguration
总结:
1.SpringBoot使用SpringFactoriesLoader,将@EnableAutoConfig对应的自定义autoConfig类加载到IOC中.
2.Starter中除了封装的AutoConfig bean,还有把需要的依赖的jar包依赖,拉取进来,极大的简化了配置.