自动装配原理
SpringBoot自动装配到底是做了什么?怎么实现的?如果你也感兴趣,不妨往下看呢
要知道SpringBoot自动装配做了什么,我们不妨创建一个Spring+Mybatis项目和SpringBoot+Mybatis项目,对比一下两个项目整合MyBatis框架都做了什么。
-
首先Spring整合Mybatis,我们来看看一般步骤:
1.创建Maven工程
2.引入Spring相关依赖、MyBatis依赖、MySQL驱动依赖
3.添加配置文件spring-mybatis.xml,编写Mybatis配置(注入SQLSessionFactory、包扫描路径,数据库连接信息)
4.配置*mapper.xml路径,添加数据库配置
-
看看SpringBoot整合Mybatis,要做哪些事情呢?
1.创建Maven工程
2.引入SpringBoot启动器依赖,MyBatis依赖、MySQL驱动依赖
3.配置mapper的包扫描路径
4.配置*mapper.xml路径,添加数据库配置
对比上面的步骤,在SpringBoot项目中spring-mybatis.xml配置文件不见了。我希望你能意识到一点:配置文件不见了不是说没有了,而是框架帮你写了。这也就是SpringBoot自动装配做的事情。
下面的问题是,SpringBoot怎么实现的?要做到帮我们写配置文件,要解决如下几个问题:
1.把MyBatis的通用配置抽取出来,形成一个配置文件(SpringBoot形成的是注解形式的配置文件)
2.跨项目读取配置文件。SpringBoot写的配置文件肯定放在SpringBoot相关库里,那相当于我的项目要到其他项目里去读取配置文件。
3.过滤掉不需要的配置文件(我现在创建的项目只要Mybatis,其他框架都不集成,那他已经把整合SpringMVC的配置文件写好了,视图解析器InternalResourceViewResolver都要注入了,怎么把它过滤掉?)
我们一个一个来看:
1.各大框架的默认配置文件,文件名都放在spring.factories这个目录下了,看图:
配置文件放在这,看图:
OK,现在只要我们想找,就可以找到SpringBoot帮我们写的所有配置文件了。
现在我们看第二个问题:怎么让本地项目识别到这么多默认的配置文件呢。SpringBoot的做法是使用Spring提供的@Import注解。这个注解允许我们合并多个配置文件的配置信息。也就是说理论上我们可以把SpringBoot帮我们写的所有配置文件都合并到Spring的配置文件里,SpringBoot也是这么做的。
SpringBoot核心注解:@SpringBootApplication(@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan)
@EnableAutoConfiguration上标注了@Import(AutoConfigurationImportSelector.class),AutoConfigurationImportSelector::selectImports方法去读取spring.factories
或者 org.springframework.boot.autoconfigure.AutoConfiguration.imports
的配置文件列表,所有包含这两个文件的包里面读取配置文件,那第二个问题也解决了
第三个问题是,怎么过滤掉我们不需要的配置文件。比如我现在压根不需要SpringMVC的配置文件,我们来看看SpringBoot写的配置文件做了什么:
它使用了@ConditionalOnclass注解,判断只有当当前项目中存在Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class时,才会读取这个配置类。换句话说只有你添加了SpringMVC的依赖,那么这个配置文件才会被加载。
这三个问题解决了,也就实现了自动装配,那么其他的事就交给Spring去做吧。完结,欢迎进入源码的世界。