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 ...
随机推荐
- ros topic 命令
#查看topic频率rostopic hz /xxx_imu_driver/imu #查看topic信息rostopic info /xxx_imu_driver/imu #查看topic数据rost ...
- Tkinter 之Button标签
一.参数说明 语法 作用 Button(root,text='xxxx') 按钮图标显示内容 Button(root,text='xxxx',height=2) 组件的高度(所占行数) Button( ...
- vue中的父组件传值给子组件
以上父组件以及父组件里面的代码 下面是子组件以及里面的代码
- start、就绪、运行状态的demo演示
1.start状态: package com.roocon.thread.t1; public class NewThread implements Runnable { @Override publ ...
- JDBC的概述和简单使用
1. 概念 JDBC是 Java DataBase Connectivity 的简写,翻译过来就是 Java 操作数据库. 目的是使用统一的Java代码操作所有关系型数据库. JDBC实际是定义了一套 ...
- 基于Python的GMSSL实现
基于Python的GMSSL实现 团队任务 一.小组讨论对课程设计任务的理解 基于Python的GMSSL实现,即GmSSL开源加密包的python实现,支持其SM2/SM3/SM4等国密(国家商用密 ...
- Selenium: 利用select模块操作下拉框
在利用selenium进行UI自动化测试过程中,经常会遇到下拉框选项,这篇博客,就介绍下如何利用selenium的Select模块来对标准select下拉框进行操作... 首先导入Select模块: ...
- LDAP的filter查询详解
转: 等于(EQUAL TO): =大于等于(Greater than): >=小于等于(Less than): <=通配符(wildcard): * 逻辑运算符:逻辑与(log ...
- 使用LAS数据集创建DEM和DSM
作为 LAS 数据集转栅格工具的输入.大多数情况下,此工具的栅格化通过点的快速分组来完成.由于激光雷达相比较于其他采样技术比较密集,所以许多人相信分组已经足够了,不需要更耗时的插值方法.可以证明上述观 ...
- ASP.NET Routing Debugger
How do you debug MVC 4 API routes? 解答1 RouteDebugger is good for figuring out which routes will/will ...

