有使用过SSM框架的,还记得曾经在spring-mybatis.xml配置了多少内容吗?数据源、连接池、会话工厂、事务管理···,而现在Spring Boot告诉你这些都不需要了,简单的几个注解统统搞定,是不是很方便!
前言
SpringBoot的自动装配(Auto-configuration)是其核心特性之一,旨在简化应用程序的配置过程。通过自动装配,能够根据类路径中的依赖关系自动配置 Spring 应用程序上下文,容器启动后,一些配置类、bean对象自动存入到了IOC容器中,不需要我们去手动声明,从而简化了开发,省去了繁琐的配置操作。这大大减少了开发者需要手动配置的内容,使得应用程序开发变得更加容易。
□ 自动配置的优势
1. 简化配置
减少了大量重复性的、模板化的配置代码,使项目结构更加简洁,通过自动检测和配置依赖项,开发者可以更快地搭建起一个功能完备的应用程序,无需从头开始编写复杂的配置文件。
2. 提高生产力
减少了手动配置的工作,即减少了配置错误的可能性,提高应用程序的稳定性,同时降低了学习曲线,开发人员能够更专注于业务逻辑开发。
3. 增强可维护性
自动配置确保了所有使用相同依赖的项目都遵循一致的配置标准,通过查看 application.properties 或 application.yml 文件以及相关注释,其他开发者更容易理解应用的配置意图。
4. 灵活可控
可以根据项目需要,选择最适合当前环境的配置
□ 自动配置核心
-
起步依赖
在没有使用springboot之前,项目中需要引入很多依赖jar,然而使用springboot之后只需要引入一个spring-boot-starter-web,为什么?难道不需要了?先看一下这个jar包依赖的其他jar,如下图:
图中我看可以看出spring-boot-starter-web所依赖jar,不仅包含Tomcat、JSON还有spring-webmvc、spring-aop、spring-context等,因此可以看出并不是不需要,而是依托Maven的依赖传递简化了。 -
自动装配
一个SpringBoot工程想要成功运行,就必须拥有一个被@SpringBootApplication 注解标识的主程序类,为什么一个 @SpringBootApplication注解就能完成?点进注解看一下,如图:
核心注解包含三个
a. @SpringBootConfiguration
使用@Configuration修饰这个注解。代表当前这个注解是一个配置类
b. @ComponentScan
用于扫描组件,相当于context:component-scan,可以指定多个路径,将需要扫描装配路径中的所有spring组件;默认扫描该类所在包及其子包下所有带有指定注解的类,将它们自动装配到bean容器中,会被自动装配的注解包括@Controller、@Service、@Component、@Repository等。也可以指定扫描路径。
c. @EnableAutoConfiguration
开启自动导包配置注解,点进去之后发现里面核心注解是@AutoConfigurationPackage和@Import(AutoConfiguration***.class),而使用@Import导入的类会被Spring加载到IOC容器中。这里导入了AutoConfigurationImportSelector类。这个类中有一个非常重要的方法——selectImports(),它几乎涵盖了组件自动装配的所有处理逻辑,包括获得候选配置类、配置类去重、排除不需要的配置类、过滤等,最终返回符合条件的自动配置类的全限定名数组。逻辑大致如下:
● 从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;
● 去重,并将exclude和excludeName属性携带的类排除;
● 过滤,将满足条件(@Conditional)的自动配置类返回;
总结
spring boot的两个核心特性:起步依赖和自动配置
起步依赖的原理:maven的依赖传递
自动配置的原理:条件注入