SpringBoot自动装配

自动装配原理

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去做吧。完结,欢迎进入源码的世界。

相关推荐
apihz1 天前
反向DNS查询与蜘蛛验证免费API接口详细教程
android·开发语言·数据库·网络协议·tcp/ip·dubbo
Dolphin_Home1 天前
【实用工具类】NullSafeUtils:一站式解决Java空值安全与通用操作(附完整源码)
java·网络·spring boot·后端·spring
高山上有一只小老虎1 天前
判断是否为数独数组
java·算法
好学且牛逼的马1 天前
【手写Mybatis | version0.0.3 附带源码 项目文档】
开发语言·php·mybatis
okseekw1 天前
File类:你与文件的"爱恨情仇"——Java文件操作的趣味指南
java·后端
海上彼尚1 天前
Go之路 - 2.go的常量变量[完整版]
开发语言·后端·golang
梨落秋霜1 天前
Python入门篇【if判断语句】
android·java·python
萝卜白菜。1 天前
关于maxPartCount和maxPartHeaderSize参数的限制说明
java·tomcat
kkk_皮蛋1 天前
深入理解 WebRTC 临界锁实现与 C++ RAII 机制
开发语言·c++·webrtc
i_am_a_div_日积月累_1 天前
el-table实现自动滚动;列表自动滚动
开发语言·javascript·vue.js