关于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的细节和初始自动配置的更多相关文章

  1. SrpingBoot入门到入坟01-HelloWorld和SpringBoot打Jar包

    第一个SpringBoot: 建立一个maven项目: 再pom.xml里面增加依赖: <?xml version="1.0" encoding="UTF-8&qu ...

  2. SrpingBoot入门到入坟04-配置文件

    SpringBoot使用一个全局的配置文件,名称是固定,作用就是修改SpringBoot自动配置的默认值. *application.properties *application.yml 先看看两者 ...

  3. SrpingBoot入门到入坟03-基于idea快速创建SpringBoot应用

    先前先创建Maven项目然后依照官方文档再然后编写主程序写业务逻辑代码才建立好SpringBoot项目,这样太过麻烦,IDE都支持快速创建,下面基于idea: 使用Spring Initializer ...

  4. 深度分析ReentrantLock源码及AQS源码,从入门到入坟,建议先收藏!

    一.ReentrantLock与AQS简介 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:Reentra ...

  5. testlib.h从入门到入坟

    学了这么久OI连个spj都不会写真是惭愧啊... 趁着没退役赶紧学一波吧 配置 github下载地址 我是直接暴力复制粘贴的.. 然后扔到MingW的目录里 直接引用就好啦 基本语法 引用testli ...

  6. SpringBoot整合SpringData JPA入门到入坟

    首先创建一个SpringBoot项目,目录结构如下: 在pom.xml中添加jpa依赖,其它所需依赖自行添加 <dependency> <groupId>org.springf ...

  7. nginx从入门到入坟

    目录 1.nginx下载安装 2.启动命令 3.服务脚本 4.nginx目录说明 5.nginx配置文件 6.虚拟主机与域名配置和站点配置 6.1server_name配置规则 7.反向代理负载均衡配 ...

  8. Mina入门:mina版之HelloWorld[z]

    Mina入门:mina版之HelloWorld [z] 一,前言: 在完成上篇文章<Mina入门:Java NIO框架Mina.Netty.Grizzly简介与对比>之后,我们现在可以正式 ...

  9. php从入门到放弃系列-02.php基础语法

    php从入门到放弃系列-02.php基础语法 一.学习语法,从hello world开始 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器&qu ...

随机推荐

  1. ros topic 命令

    #查看topic频率rostopic hz /xxx_imu_driver/imu #查看topic信息rostopic info /xxx_imu_driver/imu #查看topic数据rost ...

  2. Tkinter 之Button标签

    一.参数说明 语法 作用 Button(root,text='xxxx') 按钮图标显示内容 Button(root,text='xxxx',height=2) 组件的高度(所占行数) Button( ...

  3. vue中的父组件传值给子组件

    以上父组件以及父组件里面的代码 下面是子组件以及里面的代码

  4. start、就绪、运行状态的demo演示

    1.start状态: package com.roocon.thread.t1; public class NewThread implements Runnable { @Override publ ...

  5. JDBC的概述和简单使用

    1. 概念 JDBC是 Java DataBase Connectivity 的简写,翻译过来就是 Java 操作数据库. 目的是使用统一的Java代码操作所有关系型数据库. JDBC实际是定义了一套 ...

  6. 基于Python的GMSSL实现

    基于Python的GMSSL实现 团队任务 一.小组讨论对课程设计任务的理解 基于Python的GMSSL实现,即GmSSL开源加密包的python实现,支持其SM2/SM3/SM4等国密(国家商用密 ...

  7. Selenium: 利用select模块操作下拉框

    在利用selenium进行UI自动化测试过程中,经常会遇到下拉框选项,这篇博客,就介绍下如何利用selenium的Select模块来对标准select下拉框进行操作... 首先导入Select模块: ...

  8. LDAP的filter查询详解

    转: 等于(EQUAL TO):  =大于等于(Greater than):  >=小于等于(Less than):  <=通配符(wildcard):  *  逻辑运算符:逻辑与(log ...

  9. 使用LAS数据集创建DEM和DSM

    作为 LAS 数据集转栅格工具的输入.大多数情况下,此工具的栅格化通过点的快速分组来完成.由于激光雷达相比较于其他采样技术比较密集,所以许多人相信分组已经足够了,不需要更耗时的插值方法.可以证明上述观 ...

  10. ASP.NET Routing Debugger

    How do you debug MVC 4 API routes? 解答1 RouteDebugger is good for figuring out which routes will/will ...