起步依赖
概念
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起支持某一功能。
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能
例子-搭建Web应用
Spring+SpringMVC
我们需要添加许多依赖,还要考虑到不同依赖之间存在版本冲突的问题,一般搭建一个Web项目时需要导入以下依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
SpringBoot
搭建Web项目只需要导入一个起步依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
也就是只需要导入一个名为 web 的起步依赖即可,我们点 spring-boot-starter-web 进去可以看到,其实这个起步依赖集成了常用的 web 依赖,如下:
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能
在使用 Spring Boot 的起步依赖之前,我们需要在 pom.xml 中添加配置:
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.5.0</version>
</parent>
即让pom.xml继承Spring Boot的pom.xml,从而使用Spring Boot的pom.xml中的依赖
自动配置
概念
SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,根据配置,才决定Spring配置应该使用哪个,这个过程是Spring自动完成的。
分析
在SpringBoot中集成了一些常见的容器,或者说是组件,例如我们最常用的Tomcat服务器,所以在做web项目时,不需要再另外部署到Tomcat上,可以直接运行,这就需要整个项目有一个入口,类似于普通java程序中的main方法(其实就是main方法),这个入口我们一般用一个单独的类来表示,其中包含一个main方法,这个类通常称之为SpringBoot的引导类,SpringBoot入门程序的引导类代码如下:
@SpringBootApplication注解有两个作用,一个是标注该类是一个SpringBoot引导类,第二个作用就是开启SpringBoot自动配置。
@SpringBootApplication内部源码:
前四个注解主要是元注解用来配置该注解使用范围以及生成文档用的
- @SpringBootConfiguration
进一步进入源码可以看到它其实就是熟悉的@Configuration,在Spring纯注解配置中用来标识Spring配置引导类的
- @ComponentScan
对应Spring纯注解配置当中的@ComponentScan,用来指定开启注解扫描的位置,只不过在SpringBoot中这个位置也可以不用指定,因为它默认约定扫描的是被@SpringBootApplication修饰的引导类所在的包及其子包
- @EnableAutoConfiguration
它是SpringBoot特有的,只有当这个注解存在时SpringBoot才会帮你完成自动配置
再次点击查看它的源码:
可以看到多出@AutoConfigurationPackage和Import({AutoConfigurationImportSelector.class})这两个注解
@AutoConfigurationPackage这个是用来管理自动配置类的
Import({AutoConfigurationImportSelector.class})先查看导入的类的源代码:
这个getAutoConfigurationEntry()方法中可以明显看到configurations这样的关键字眼(通过下面的分析可以确定里面装的是一些配置类的全限定类名),而且它是一个字符串类型的集合,它来自于getCandidateConfigurations()方法,所以我们在这个类中继续往下找这个方法:
我们可以看到这个配置的相关类可能是在某个路径下的,我们去到我们导入的这个org.springframework.boot.autoconfigure去找到这个路径,可以看到META-INF路径下的spring.factories文件
我们常见的配置也在里面
根据org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration类全名找到相关类的源代码发现:
再次深入
发现主要是一些信息的配置,可以看到这个类中定义了很多跟tomcat服务器有关的属性,如port端口、address地址等。
prefix主要是声明配置文件的前缀
找到spring-configuration-metadata.json这个文件,在META-INF路径下。
在这个.json文件中可以找到刚才相关的配置,也就是说这些配置是Springboot在加载时自动帮我们配置好的了,如果我们想要修改这些配置就要在我们项目的配置文件中进行修改。
自动配置的分析到这里就可以告一段落了,虽然不算太深入的分析,但是对初学者来讲已经算是可以了,等进一步熟练它的使用后,可以再进一步往底层挖掘,虽然有些太细节的东西,在项目开发中基本用不到,但是自己有一定了解的话,在使用过程中碰到问题可以有更清晰的思路去定位并解决。
总结
- SpringApplication会寻找 META-INF/spring.factories 文件,读取其中以EnableAutoConfiguration 为key的所有类的名称, 这些类就是提前写好的自动配置类。
- 这些配置类不一定全部生效,因为有@ConditionalOn注解,满足一定条件才会生效, 通过自动配置类的@Bean注解所在的方法创建对应的对象
- 可以通过配置application.yml或application.properties文件,来覆盖自动配置中的默认属性。
原文链接:深入浅出Spring Boot 起步依赖和自动配置_Java_No2的博客-CSDN博客
原文链接:浅析SpringBoot起步依赖和自动配置原理_daizhipeng--的博客-CSDN博客_起步依赖和自动配置原理
版权归原作者 肉蟹宝 所有, 如有侵权,请联系我们删除。