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

相关推荐
0白露40 分钟前
Apifox Helper 与 Swagger3 区别
开发语言
Tanecious.2 小时前
机器视觉--python基础语法
开发语言·python
叠叠乐2 小时前
rust Send Sync 以及对象安全和对象不安全
开发语言·安全·rust
战族狼魂2 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
Tttian6223 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
xyliiiiiL3 小时前
ZGC初步了解
java·jvm·算法
杉之4 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
hycccccch4 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
独好紫罗兰4 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
天天向上杰5 小时前
面基JavaEE银行金融业务逻辑层处理金融数据类型BigDecimal
java·bigdecimal