SpringBoot 启动类 @SpringBootApplication 注解

2023-05-16

@SpringBootApplication是SpringBoot项目的核心注解,目的是开启自动配置。

annotation

以下是@SpringBootApplication源代码的一部分:

@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 {
  注:java中@interface和interface的区别:
  inerface:声明了这是一个java的接口
  @interface:表明继承了java.lang.annotation.Annotation接口,而不是声明了一个interface

@ComponentScan注解

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

(1)@ComponentScan的作用
@ComponentScan这个注解在Spring中很重要,主要就是定义扫描路径从中找出标识了需要装配的类自动装配到Spring的bean容器中。
(2)@ComponentScan的扫描路径
关于扫描路径,可以通过basePackages等属性来定制@ComponentScan自动扫描的范围,如果不指定,Spring框架会自动从声明@ComponentScan所在类的package进行扫描。所以,SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。
(3)想要被扫描到,就必须加上@ComponentScan注释
@ComponentScan会告诉Spring哪个pakages的用注解标识的类会被Spring自动扫描并装进bean容器。
例如,如果相应packages下的某个类用@Controller注解标识了,当没有一同加上@ComponentScan注解,那么,这个Controller就不会被Spring扫描到,更不会被撞倒Spring容器中。因此,这样配置的Controller毫无意义。
(4)@ComponentScan属性的作用

  • basePackageClasses:扫描类所在包下的所有组件,而不是某个组件。
  • excludeFilters:指定不适合组件扫描的类型。
  • includerFilters:指定适合组件扫描的类型。
  • lazyInit:指定是否应注册扫描的bean为lazy初始化1
  • nameGenerator:用于将在spring容器中检测到的组件命名。
  • resourcePattern:控制可用于组件检测的类文件。
  • scopedproxy:
  • scopeResolver:用于决定检测到的组件的范围
  • useDefaultFilters:用于决定是否自动检测类的注释

@EnableAutoConfiguraion

(1)@EnableAutoConfiguraion的作用
借助**@Import(AutoConfigurationImportSelector.class)**的支持,收集和注册特定场景相关的bean定义。

  • @EnableScheduling是通过@Import将Spring调度框架相关的bean定义加载到loC容器。
  • @EnableMBeanExport是通过@Import将JMX相关的bean定义加载到loC容器的。
    @EnableAutoConfiguraion也是借助的@Import的帮助,将所有符合自动配置条件的bean定义加载到loC容器的。

(2)@EnableAutoConfiguraion的关键注解:@Import(AutoConfigurationImportSelector.class)

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration 

最关键的要素@Import(AutoConfigurationImportSelector.class),借助AutoConfigurationImportSelector,@EnableAutoConfiguraion可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的loC容器中。

(3)@Import(AutoConfigurationImportSelector.class)的关键函数:selectImports

public String[] selectImports(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}

AutoConfigurationImportSelector类最核心的函数是selectImports,其核心功能就是获取spring.factories中EnableAutoConfiguration所对应的Configurarion类列表,由@EnableAutoConfiguration注解中的exclude/excludeName参数筛选一遍,再由AutoConfigurationImportFilter类将所有实例筛选一遍,得到最终用用Import的configuration和exclusion。

@SpringBootConfiguraion

继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@bean注解标记的方法的实例纳入spring容器中,并且实例名就是方法名。

@Target注解

定义描述注解的使用范围。
ElementType表示取值,TYPE:用于描述类、接口(包括注解类型) 或enum声明。

@Retention注解

定义被它所注解的注解保留多久。

source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略

class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期

runtime:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在

@Documented

表明这个注释是由 javadoc记录的

@Inherited

关于java中元注解2Inherited的使用说明

类继承关系中@Inherited的作用:
类继承关系中,子类会继承父类使用的注解中被@Inherited修饰的注解

接口继承关系中@Inherited的作用:
接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰

类实现接口关系中@Inherited的作用:
类实现接口时不会继承任何接口中定义的注解


  1. lazy初始化:延迟到需要域的值时,才将其初始化;如果不需要域的值,就不将其初始化。 ↩︎

  2. 元注解:声明注解类型时需要用到的注解。 ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot 启动类 @SpringBootApplication 注解 的相关文章

  • Windows Server 2016域控服务器如何取消密码复杂性规则

    图 1 报错截图 具体解决办法 第一步 打开服务器管理 如图直接在 放大镜搜索框里面 直接输入搜索服务器管理或者打开箭头3所示的图标 第二步 点击工具 打开组策略管理 第三步 找到 Default Domain Policy 然后鼠标右击编
  • noVNC搭建

    noVNC搭建 1 环境准备 Os centos7 5准备两台设备 192 168 17 176 和 192 168 17 177 2 安装python环境 安装python3 在192 168 17 176操作如下 查看之前是否存在环境
  • Arduino小项目1---esp8266 WiFi 签到机

    Arduino小项目1 ESP8266 WiFi 签到机 前言0 使用的材料和软件1 准备一个HTML网页A 搭建出适合手机的页面框架B 在body中加入表单元素form标签 xff1a 它的常用属性是action xff0c 就是把表单提
  • 如何找回忘记的Facebook密码

    If you don t use a password manager those complex passwords can be pretty hard to remember If you ve forgotten your Face
  • Cube-SLAM编译遇到的问题

    error iota was not declared in this scope 解决办法 xff1a 报错位置添加 xff1a span class token macro property span class token direc
  • CubeSLAM学习

    Cube SLAM 此代码包含两种模式 xff1a 与ORB SLAM集成的对象SLAM 请参见orb object slam具有ros bag输入的在线SLAM 读取离线检测到的3D对象仅适用于多维数据集SLAM的基本实现 参见objec
  • [转载]PAC模式与全局模式的区别

    区别一 xff1a 使用流量多少不一样 PAC模式 xff1a 节省流量 全局模式 xff1a 流量消耗较多 区别二 xff1a 运行速度快慢不一样 PAC模式 xff1a 国内网站依旧走本地网络 xff0c 速度快 xff0c 绝大部分国
  • 【语音控制ROS】PocketPhinx语音包的使用<三>

    语音控制机器人 语音控制ROS 虚拟机安装Ubuntu14 04 43 ROS indigo xff1c 一 xff1e 语音控制ROS 仿真环境的搭建 xff1c 二 xff1e 用语音来控制机器人移动 前提 xff1a 安装好了ROS环
  • 【C++/文件读写】合并两文件

    要求 编写一程序 xff0c 将两个文件合并成一个文件 代码 span class token macro property span class token directive keyword include span span clas
  • legoloam报错Point cloud is not in dense format, please remove NaN points first!

    错误 Point cloud is not in dense format please remove NaN points first 解决问题 找到utility h将useCloudRIng设置为false 重新编译即可
  • 【转载】C / C++ 读取文件出现乱码解决方法 | 输出到文件出现乱码

    昨天用C语言写了一下文件读取 xff0c 发现读出来的全是乱码 这肯定是文字编码不同导致的 据我查证 xff0c C语言的汉字编码方式是由你电脑决定的 xff0c 所以需要看一下你电脑是什么编码 xff0c 来确定你需要把文本文件改成什么编
  • 【计算机网络】基础概念总结6-子网掩码

    6 子网掩码 6 1 为什么要有子网掩码 随着互联网的飞速发展 xff0c 我们消耗 IP 的速度越来越快 xff0c IP 地址渐渐的又不够用了 xff0c 因此 xff0c 在 1993 年 xff0c 引入了一种新的方法 xff0c
  • 【shell】批量修改文件前缀和后缀

    需求 做实验时需要对相片名称进行修改 xff0c 以递增的顺序 并且修改后缀 奈何网上找的脚本都不能用 xff0c 只有自己写一个 代码 span class token shebang important bin bash span sp
  • 【shell】录制操作

    用途 制作教学用途 使用方法 首先是录制 script t span class token operator span class token file descriptor important 2 span gt span timing
  • Apple Watch上的静音模式,免打扰模式和剧院模式之间的区别(以及何时使用每种模式)

    Since it was introduced the Apple Watch has gained a number of different modes but it s not immediately clear when to us
  • 【C++】STL-unodered_map

    文章目录 STL unodered map简介unordered map与map对比自定义key测试参考 STL unodered map 简介 unordered map 容器 xff0c 直译过来就是 34 无序 map 容器 34 的
  • Shell函数参数

    在shell中调用函数时 xff0c 可以向其传递参数 xff0c 其中常用的特殊变量如下表所示 xff1a 函数参数 含义 传递到脚本或函数的参数个数 n 1表示第一个参数 xff0c 2表示第二个参数 注意 xff0c 当n gt 61
  • Dockerfile

    Dockerfile Dockerfile是一种文本文件 xff0c 用于定义如何构建Docker镜像 它包含一系列的指令 xff0c 告诉Docker引擎如何在容器中构建和运行应用程序 Dockerfile指令分类 xff1a 基础镜像指
  • thonny中文版|python编辑

    由于人工智能的兴起 xff0c python语言成了最受欢迎的编程语言 xff0c 为此小编给广大新手用户带来了thonny编辑器 xff0c 这是一款相当优秀的python初学者专用编程学习工具 该软件基于python内置图形库tkint
  • 如何限制HTML中select标签option可见选项数目

    如何限制HTML中select标签option可见选项数目 在使用select标签的时候 xff0c 如果option选项太多 xff0c 会造成下拉列表变得很长 xff08 浏览器默认20条 xff09 如果想控制select中的opti

随机推荐