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

相关推荐
Smile灬凉城6668 分钟前
反序列化为啥可以利用加号绕过php正则匹配
开发语言·php
lsx20240619 分钟前
SQL MID()
开发语言
Dream_Snowar22 分钟前
速通Python 第四节——函数
开发语言·python·算法
西猫雷婶24 分钟前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
鸿蒙自习室24 分钟前
鸿蒙UI开发——组件滤镜效果
开发语言·前端·javascript
星河梦瑾24 分钟前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富27 分钟前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
love静思冥想29 分钟前
JMeter 使用详解
java·jmeter
言、雲32 分钟前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
TT哇39 分钟前
【数据结构练习题】链表与LinkedList
java·数据结构·链表