SrpingBoot入门到入坟02-HelloWorld的细节和初始自动配置
关于SpringBoot的第一个HelloWorld的一些细节:
1.父项目
首先查看项目中的pom.xml文件

文件中有个父项目,点进去则:

它里面也有一个父项目,再点进去:

可以发现有很多的依赖版本,其实它来真正管理SpringBoot应用里面的所有依赖版本,也称为SpringBoot的版本仲裁中心。也就是我们以后导入依赖是不需要写版本了(如果没有在该管理中的依赖,则还是需要声明版本号的)。
2.导入的依赖:
在之前的HelloWorld中的pom.xml还有我们自己导入的一个依赖:

可以看出我们导入了“spring-boot-starter-web”的依赖,不妨将这些拆开来看:分别为“spring-boot-starter”和“web”;那什么叫“spring-boot-starter”呢?其实就是springboot的场景启动器;点进去可以看到:

它里面也导入了很多依赖;所以spring-boot-starter-web的作用就是:帮我们导入web模块正常运行所依赖的组件。而在SpringBoot中,还有很多启动器:

一句话总结:SpringBoot将所有的功能场景都抽取出来,做成一个个的starter(启动器);只需要在项目中引入这些starter相关场景的所有依赖都会被导入进来,需要什么功能就导入什么场景的启动器。
3.主程序类
package com.lql; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; /**
* @author: lql
* @date: 2019.11.15
* Description: 启动类
*/
@SpringBootApplication
public class HelloWorldApplication { public static void main(String[] args) { SpringApplication.run(HelloWorldApplication.class,args);
}
}
主程序类中有个核心注解:@SpringBootApplication:翻译过来就是springboot程序,将这个注解标识在某个类上就说明是SpringBoot的主配置类,SpringBoot就应该运行这个类的Main()来启动SpringBoot应用。那么这个注解到底什么呢?打开这个注解可以发现它是个组合注解:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
第一个注解:@SpringBootConfiguration:springboot的配置类:标注在某个类上,表示这是一个Spring Boot的配置类,而点进SpringBootConfiguration则能看到:@Configuration;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
而@Configuration是配置类上使用的注解,作用就是将配置类===配置文件。当再次点进去其实发现它就是个组件:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
第二个注解:@EnableAutoConfiguration:开启自动配置功能;以前需要配置的东西现在由SpringBoot帮我们自动配置。该注解就是告诉SpringBoot开启自动配置功能,这样自动配置才能生效。点开这个注解:
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
它里面有个@AutoConfigurationPackage注解:自动配置包;在点进去则:
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
}
它是用@Import({Registrar.class})来完成的功能;Import是Spring的底层注解,作用就是给容器中导入一个组件。点进后面的.class;在程序中打断点然后启动主程序类:

上图则表示:将标识@SpringBootApplication的类所在包及下面所有子包里面的所有组件扫描到Spring容器,上图拿到的包是“com.lql”,所以我们刚开始定义的Controller也能被扫描进来,以为是其子包:

在@EnableAutoConfiguration中还有一个注解:@Import({AutoConfigurationImportSelector.class});刚才也说了Import是给容器导入组件的,导入的的组件是“AutoConfigurationImportSelector”:导入哪些组件的选择器。
进入AutoConfigurationImportSelector加个断点debug启动:
意思就是说会给容器导入非常多的自动配置类(xxxAutoConfiguration);这些自动配置类就是给容器中导入这个场景需要的所有组件,并配置好。具体细节以后再说,有了自动配置类,免去了我们手动编写配置和注入功能组件的工作。
其实就是SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,所在的jar都在"spring-boot-autoconfigure-2.1.10.RELEASE.jar"里;
SrpingBoot入门到入坟02-HelloWorld的细节和初始自动配置的更多相关文章
- SrpingBoot入门到入坟01-HelloWorld和SpringBoot打Jar包
第一个SpringBoot: 建立一个maven项目: 再pom.xml里面增加依赖: <?xml version="1.0" encoding="UTF-8&qu ...
- SrpingBoot入门到入坟04-配置文件
SpringBoot使用一个全局的配置文件,名称是固定,作用就是修改SpringBoot自动配置的默认值. *application.properties *application.yml 先看看两者 ...
- SrpingBoot入门到入坟03-基于idea快速创建SpringBoot应用
先前先创建Maven项目然后依照官方文档再然后编写主程序写业务逻辑代码才建立好SpringBoot项目,这样太过麻烦,IDE都支持快速创建,下面基于idea: 使用Spring Initializer ...
- 深度分析ReentrantLock源码及AQS源码,从入门到入坟,建议先收藏!
一.ReentrantLock与AQS简介 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:Reentra ...
- testlib.h从入门到入坟
学了这么久OI连个spj都不会写真是惭愧啊... 趁着没退役赶紧学一波吧 配置 github下载地址 我是直接暴力复制粘贴的.. 然后扔到MingW的目录里 直接引用就好啦 基本语法 引用testli ...
- SpringBoot整合SpringData JPA入门到入坟
首先创建一个SpringBoot项目,目录结构如下: 在pom.xml中添加jpa依赖,其它所需依赖自行添加 <dependency> <groupId>org.springf ...
- nginx从入门到入坟
目录 1.nginx下载安装 2.启动命令 3.服务脚本 4.nginx目录说明 5.nginx配置文件 6.虚拟主机与域名配置和站点配置 6.1server_name配置规则 7.反向代理负载均衡配 ...
- Mina入门:mina版之HelloWorld[z]
Mina入门:mina版之HelloWorld [z] 一,前言: 在完成上篇文章<Mina入门:Java NIO框架Mina.Netty.Grizzly简介与对比>之后,我们现在可以正式 ...
- php从入门到放弃系列-02.php基础语法
php从入门到放弃系列-02.php基础语法 一.学习语法,从hello world开始 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器&qu ...
随机推荐
- JavaEE的ajax入门
JavaEE的ajax入门 代码下载 链接:https://pan.baidu.com/s/1pb_sdSmV9Ncs6UIz3q2ztg 提取码:fgx6 复制这段内容后打开百度网盘手机App,操作 ...
- 请写出一段python代码实现删除list里面的重复元素?
l1 = ['b','c','d','c','a','a'] l2 = list(set(l1)) print(l2)
- elasticsearch 动态映射
https://www.elastic.co/guide/cn/elasticsearch/guide/current/dynamic-mapping.html#dynamic-mapping当 El ...
- Vue源码分析(二) : Vue实例挂载
Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...
- 使用多个tomcat如何修改端口号
一.找到tomcat下conf文件夹下server.xml: 二.修改8080端口 三.修改8009端口 四.修改8005端口 修改后同时启动多个tomcat成功.
- Python问题:error: Microsoft Visual C++ 9.0 is required
Python问题:error: Microsoft Visual C++ 9.0 is required 原因是缺少编译C的 VCForPython包. 解决办法: 安装VCForPython即可. ...
- CORTEX-M3中断的现场保护问题
在<Cortex-M3 Devices Generic User Guide.pdf>中介绍了异常入栈和出栈的情况,详见2.3 Exception model.Cortex-M3内核的寄存 ...
- 阿里云RDS与ECS服务器数据库做主从
阿里云RDS与ECS服务器数据库做主从 [精] 里云RDS(数据库)基于飞天大规模分布式计算和存储能力,提供超高性价比的单机版实例,同时利用读写分离横向扩展读能力,满足网站类的业务需求.提供稳定.高性 ...
- 安装TensorFlow时出现ERROR: Cannot uninstall 'wrapt'问题的解决方案
pip install -U --ignore-installed wrapt enum34 simplejson netaddr pip install -i https://pypi.tuna.t ...
- PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)--续
2.PHP与Mysqli扩展,面向过程.对象 <?php $mysql_conf = array( 'host' => '127.0.0.1:3306', 'db' => 'test ...

