SpringBoot良心教程(四)依赖管理特性--自动配置原理
SpringBoot特点
1.1、依赖管理
我们在上一个HelloWorld的项目中,引入了一个父项目,然后细心的同学会发现,我们在引入其他dependency的时候,都没有写版本号:
<!-- pom.xml中引入的父项目 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
</parent>
<!-- 上面的父项目里的父项目 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.2</version>
</parent>
<!-- 再进入上述父项目,可以在properties标签中看到,原来版本号都写在这里 -->
<properties>
<activemq.version>5.16.2</activemq.version>
<antlr2.version>2.7.7</antlr2.version>
<commons-dbcp2.version>2.8.0</commons-dbcp2.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<commons-pool.version>1.6</commons-pool.version>
<commons-pool2.version>2.9.0</commons-pool2.version>
<couchbase-client.version>3.1.6</couchbase-client.version>
<db2-jdbc.version>11.5.5.0</db2-jdbc.version>
<dependency-management-plugin.version>1.0.11.RELEASE</dependency-management-plugin.version>
<derby.version>10.14.2.0</derby.version>
<dropwizard-metrics.version>4.1.24</dropwizard-metrics.version>
<ehcache.version>2.10.9.2</ehcache.version>
<ehcache3.version>3.9.4</ehcache3.version>
<elasticsearch.version>7.12.1</elasticsearch.version>
<embedded-mongo.version>3.0.0</embedded-mongo.version>
<flyway.version>7.7.3</flyway.version>
<freemarker.version>2.3.31</freemarker.version>
<git-commit-id-plugin.version>4.0.5</git-commit-id-plugin.version>
<glassfish-el.version>3.0.3</glassfish-el.version>
<glassfish-jaxb.version>2.3.4</glassfish-jaxb.version>
<groovy.version>3.0.8</groovy.version>
</properties>
<!-- 在下面的dependencies中,去取用上面的版本号,以hibernate举例 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
以上可以看出,父工程中几乎声明了所有开发中用到的jar的版本号,称为自动版本仲裁机制,也就是当前SpringBoot版本中的适配版本。
以后怎么引入需要的依赖呢
比如想引入mysql,直接在pom.xml文件中写入
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
可以在parent的parent工程中找到SpringBoot已经写入了版本号(仲裁)的mysql,所以不用写版本号。
如果想引入的依赖,在parent的parent中没有写入版本号,则导入dependency的时候还是需要写版本号的

刷新后,mysql依赖就被导入了。

同理,进入之前HelloWorld项目中的,可以看到,其实spring-boot-starter-web就是帮我们一次性导入了web开发常用框架以及Tomcat服务器。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.5.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.5.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.8</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
<scope>compile</scope>
</dependency>
</dependencies>
那如果对他仲裁的版本号不满意,比如想把MySQL8改为MySQL5,那怎么办呢?
第一步:百度mvn,进入https://mvnrepository.com/,搜索mysql

找到自己需要的版本号,比如5.1.47

查看spring-boot-dependencies里面规定当前依赖版本用的key:mysql.version

在pom.xml中重写版本号
<properties>
<mysql.version>5.1.47</mysql.version>
</properties>
maven特性:就近优先原则,当前pom配置了就用当前配置的,没有配置才使用父项目的。
starter场景启动器
- SpringBoot开发中,会见到很多spring-boot-starter-:代表某种场景
- 只要引入starter,这个场景的所有常规需要的依赖都被自动引入
- SpringBoot所有支持的场景:地址
- 如果官方提供的starter还不能满足我们的需求,那我们可以自定义自己的starter,这部分是高阶知识,后边讲(待更新~),官方推荐的命名方式为*-spring-boot-starter,以后见到这样命名的启动器,就知道是第三方为我们提供的简化开发的场景启动器。

在pom.xml中,点击右键->Diagrams->show dependencies,可以看到依赖结构,可以看到我们只引入了spring-boot-starter-web,但是包含了spring-boot-starter-tomcat,spring-boot-starter-json,spring-web,spring-webmvc等等依赖
- 进入每个依赖,可以看到所有场景启动器都要依赖spring-boot-starter(SpringBoot自动配置的核心依赖)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.2</version>
<scope>compile</scope>
</dependency>
1.2、自动配置
- 自动配好Tomcat、SpringMVC
- 引入spring-boot-starter-web的时候,自动引入了spring-boot-starter-tomcat、spring-webmvc等依赖
- 配置Tomcat
- 自动配好SpringMVC
- 引入SpringMVC全套组件
- 自动配好SpringMVC常用组件(功能)
- 自动配好web常见功能,如:字符编码问题
- SpringBoot帮我们配置好了所有web开发的常见场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.5.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.8</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
<scope>compile</scope>
</dependency>
在主程序中可以用如下方法打印出IOC中的所有bean,看一下SpringBoot究竟帮我们配置了哪些组件
/**
* 主程序类
* @SpringBootApplication:这是一个SpringBoot应用
*/
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//1、返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] beanDefinitionNames = run.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}
- 默认的包结构
- 主程序所在的包及其下面的所有子包里面的组件都会被默认扫描进来(所以不用配置包扫描,具体可以看官方解释
白话解释:使用SpringBoot的时候,不需要像以前一样配置包扫描,SpringBoot会将主程序所在的包及其子包都扫描进来,如下如,主程序所在的包也就是com.shuwei.boot

这时候如果我们在主程序所在的包外面写一个请求,是不能被默认扫描到的
比如在boot包外面写一个请求,是访问不到的


这时候,如果你非要把这些请求写在主程序的包外,那怎么办呢?
这时候就需要配置scanBasePackages,将包扫描的范围扩大。
在主程序上配置包扫描范围@SpringBootApplication(scanBasePackages = "com.shuwei")
- 主程序所在的包及其下面的所有子包里面的组件都会被默认扫描进来(所以不用配置包扫描,具体可以看官方解释
/**
* 主程序类
* @SpringBootApplication:这是一个SpringBoot应用
*/
@SpringBootApplication(scanBasePackages = "com.shuwei")
public class MainApplication {
public static void main(String[] args) {
//1、返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2、查看容器里面的组件
String[] beanDefinitionNames = run.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}
重启服务,成功。

- 各种配置都拥有默认值
- 默认配置最终都是映射到某一个类上的
- 配置文件application.properties中的值最终会绑定到某个类上,这个类会在容器中创建对象
- 按需加载所有自动配置项
- 非常多的starter
- 引入了哪些场景,这些场景的自动配置才会开启
- SpringBoot所有的自动配置功能都在Spring-boot-autoconfigure包里

浙公网安备 33010602011771号