SpringBootApplication最详细注解

news2024/9/28 9:32:38

SpringBootApplication最详细注解

  • SpringBootApplication的注解分类
    • 1.Target
  • 2.Retention
    • 3.Document
  • 4.Inherited
    • 5.SpringBootConfiguration
  • 6.@EnableAutoConfiguration
      • 6.1@AutoConfigurationPackage这个注解
        • 6.1.1 Import
        • 6.1.2 AutoConfigurationpackages.Registrar.class
      • 6.2 AutoConfigurationImportSelector.class

SpringBootApplication的注解分类

先来看看SpringBootApplication里面是啥:
在这里插入图片描述
SpringBootApplication注解中的注解的详细解释

@Target(ElementType.TYPE) //注解的作用域
@Retention(RetentionPolicy.RUNTIME) //注解的生存周期
@Documented //可以被文档化
@Inherited //注解用于标注一个父类的注解是否可以被子类继承
@SpringBootConfiguration //声明为一个配置类 proxyBeanMethods是否开启bean代理,默认是true,从IOC容器中取;如果是false则每次获取都是一个新的实例
@EnableAutoConfiguration //开启自动配置---这个将是我们研究的重点
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) //包扫描的规则

1.Target

它是用于设定注解范围(被描述的注解可以用在什么地方)也急速hi限制了注解的作用域,那啥是注解的范围?注解的范围又有哪些呢?

@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

/** Class, interface (including annotation type), or enum declaration */
    TYPE,
    //类,接口,枚举类
    /** Field declaration (includes enum constants) */
    FIELD,
    //枚举
    /** Method declaration */
    METHOD,
    //只用于方法
    /** Formal parameter declaration */
    PARAMETER,
       
    /** Constructor declaration */
    CONSTRUCTOR,
    //构造方法
    /** Local variable declaration */
    LOCAL_VARIABLE,
    
    /** Annotation type declaration */
    ANNOTATION_TYPE,
 
    /** Package declaration */
    PACKAGE,
 
    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,
 
    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE

2.Retention

说明:Retention定义了被它注解了的注解可以保留多久,我们点如它的枚举类型看看

    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,
 
    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,
 
    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME

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

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

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

生命周期:runtime>class>source

没有了解过元注解的读者可以先去了解下元注解,再回头来看这篇文章会收获很多。

3.Document

注解表明这个注解应该被 javadoc工具记录. 默认情况下,javadoc是不包括注解的. 但如果声明注解时指定了 @Documented,则它会被 javadoc 之类的工具处理, 所以注解类型信息也会被包括在生成的文档中,是一个标记注解,没有成员。
在这里插入图片描述

4.Inherited

如果一个类用上了@Inherited修饰的注解,那么其子类也会继承这个注解
在这里插入图片描述

5.SpringBootConfiguration

在这里插入图片描述
SpringBootConfiguration与Spring中的@Configuation的作用基本一致,只不过@SpringBootConfiguration是springboot的注解,而@Configuration是spring的注解。

@Configuration 可以理解为一个Configuration就是对应的一个Spring的xml版的容器;(beans)

@configuation的作用,实现IOC的关键

@Configuation等价于

@Bean等价于

@ComponentScan等价于<context:component-scan base-package=”com.dxz.demo”/>

6.@EnableAutoConfiguration

自动装配
在这里插入图片描述
Target、Retention、Documentd就不用我过多描述了,我们来看看

6.1@AutoConfigurationPackage这个注解

顾名思义:他的中文意思就是自动配置包

我们再来看看@autoConfigurationPackage里面是啥
在这里插入图片描述

6.1.1 Import

这个注解类是用于导入配置类或者一些需要前置加载的类,你就当作Import 包 / 类

6.1.2 AutoConfigurationpackages.Registrar.class

这就话其实是引用AutoConfigurationpackages抽象类里面的Registrar类

我们点进去来看看:在这里插入图片描述
这个类实现了哪些接口我们就不管了,我们直接来看它重写的两个方法:在registerBeanDefinitions方法中,我们可以从左到右读他的方法体,register(register,新建一个PackageImports匿名对象,将metadata这个对象形参填入,然后使用getPackageNames方法填入数组)

其实这就是扫描主配置类同级目录以及子包,然后一一记录下来,并将相应的组件导入到springboot创建管理的容器中。

这里我们大概就明白了@AutoConfigurationPackage这个注解的意思了,其实就是自动扫描包,并记录下来的注解,不过我们要明白的是它的作用范围是同级的包,以及以下的包,如果有包在@AutoConfigurationPackage注解范围以上,那么@AutoConfigurationPackage就扫描不到这个包。

6.2 AutoConfigurationImportSelector.class

我们先看看它的结构:在这里插入图片描述
虽然说这个类的变量很多,但是我们仍然可以看到几个带有bean、filter的变量名,那我们可以肯定这个类和bean(类的代理或代言人(实际上确实是通过反射、代理来实现的))以及filter(过滤器)有乱七八糟的关系

猜想已经确定了,我们再来看看方法体,来看我们的猜想是不是正确的。


protected Class<?> getSpringFactoriesLoaderFactoryClass() {
		return EnableAutoConfiguration.class;
}

这个方法体的名字叫做(我的直译):得到spring的工厂加载工厂类

工厂加载工厂类?我咋感觉像是实现IOC的嘞?我们再来看看返回的是啥?

return EnableAutoConfiguration.class;

只能说SpringBoot框架做的真是太厉害了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

DeepSpeed Chat: 一键式RLHF训练&#xff0c;让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来&#xff0c;ChatGPT及类似模型引发了人工智能&#xff08;AI&#xff09;领域的一场风潮。 这场风潮对数字世界产生了革命性影响。ChatGPT类模型具有惊人的泛用性&#xff0…

硬盘未格式化如何处理(硬盘忽然未格式化如何处理)

将硬盘插入电脑的时候为什么会出现“未格式化”的提示框呢?遇到这个问题时又该怎么处理呢?别慌&#xff0c;下面小编就来给大家演示一下子解决未格式化这个问题的解决方法。 硬盘未格式化如何处理工具/软件&#xff1a;sayRecy 步骤1&#xff1a;先百度搜索并下载程序打开后&…

一文吃透Java线程池——基础篇

前言 本文分为两部分。 第一部分是基础章节。可以帮助我们了解线程池的概念&#xff0c;用法&#xff0c;以及他们之间的的关系和实际应用。 第二部分是实现机制篇。通过源码解析&#xff0c;更深刻理解线程池的工作原理&#xff0c;以及各个概念的准确含义。 原本是一篇文章&…

ping不通的几种故障

网络ping不通是网络中出现频率最高的故障之一&#xff0c;同时也是最让人抓狂的故障&#xff0c;基本上大部分人都遇到过了&#xff0c;如果在项目中出现网络ping不通&#xff0c;没有一个有序的方法去排除解决&#xff0c;那么很难入手&#xff0c;也是讨论最多的问题之一&…

DNS(UOS)

安装DNS apt install bind9 nfsutils -y 切换目录 cd /etc/bind vim named.conf.defaults.zones 复制备份 cp -a db.local skills.net.zone cp -a db.127 146.16.172.in-addr.arpa vim skills.net.zone vim 146.16.172.in-addr.arpa vim /named.conf.options 重启bind9 …

javascript学习笔记

本笔记来源于B站尚硅谷javascript教程10.尚硅谷_JS基础_Null和Undefined_哔哩哔哩_bilibili 1、Null和None Null类型的值只一个&#xff0c;就是null; null这个值专门用来表示一个为空的对象; 使用typeof 检查一个null值时&#xff0c;会返回object; Undefined类型的值只有一个…

C++ 特性简化STM32 风格固件库的GPIO 操作,使用HK32F030M

所谓的STM32 风格就是指下面这种&#xff1a; // 开启时钟 RCC_AHBPeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK, ENABLE);//定义初始化结构体 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType GPIO_O…

迭代器与仿函数

迭代器与仿函数一般分类功能方式分类STL迭代器的类型迭代器辅助函数流型迭代器仿函数仿函数的编写标准库中的仿函数一般分类 正向迭代器 容器名&#xff1a;iterator it begin() end() 2.反向迭代器 容器名&#xff1a;reverse_iterator it rbegin() rend() 3.常正向迭代器 容器…

MQTT 安全解析:构建可靠的物联网系统

物联网逐渐渗透到医疗保健、智能家居、智慧城市、自动驾驶等我们生活中的各个领域。这其中所涉及到的物联设备的安全也因此变得愈发重要。一旦物联网系统遭到恶意入侵&#xff0c;不仅海量设备数据将面临丢失、被窃取和篡改等安全风险&#xff0c;使用这些设备和物联网应用的终…

Githubs的使用方法(创建仓库\分支\提交【增删改查】\拉取与合并\管理与clone代码\修改分支等操作)

Githubs的使用方法 一、github基本使用 这一小节主要介绍github的基本使用方法以及每一步的流程和作用。 1. 创建仓库 2. 创建分支 此时有两个分支&#xff1a;main 和 readme-edits。 现在&#xff0c;它们看起来完全相同。 接下来&#xff0c;将向新分支添加更改。 3. 创…

Vue3 项目实例(一)ElementPlus+ pinia+vite创建

项目搭建 热重载&#xff1a;将一个项目切分成多个JS&#xff0c;同时利用浏览器的协商缓存。 etag: 文件唯一标识 如果某一片代码没有改变&#xff0c;devServer返回304&#xff0c;浏览器继续使用原来的文件&#xff0c;否则&#xff0c;返回200&#xff0c;响应新的js文件…

RK3568平台开发系列讲解(调试篇)IS_ERR函数的使用

🚀返回专栏总目录 文章目录 一、IS_ERR函数用法二、IS_ERR函数三、内核错误码沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 IS_ERR 函数的使用。 一、IS_ERR函数用法 先看下用法: 二、IS_ERR函数 对于任何一个指针来说,必然存在三种情况: 一种是合…

知识图谱:Neo4j数据库的基本使用——创建张学良的关系谱

一、知识图谱及Neo4j数据库介绍 知识图谱&#xff08;Knowledge Graph&#xff09;是人工智能的重要分支技术&#xff0c;它在2012年由谷歌提出&#xff0c;是结构化的语义知识库&#xff0c;用于以符号形式描述物理世界中的概念及其相互关系&#xff0c;其基本组成单位是“实体…

4.1派生类的概念

&#xff1a;为什么使用继承 所谓继承就是从先辈处得到属性和行为特征。类的继承就是新的类从已有类那里得到已有特征。这样做的目的是&#xff1a;减少代码的重复。 派生类的声明 声明派生类的一般公式 &#xff1a; class 派生类名:[继承方式] 基类名 { 派生类新增的数据成…

Java并发基石_CAS原理实战02_CAS实现原理

文章目录什么是CAS&#xff1f;CAS的实现原理是什么&#xff1f;cmpxchg指令怎么保证多核心下的线程安全&#xff1f;什么是ABA问题&#xff1f;如何解决ABA问题呢&#xff1f;什么是CAS&#xff1f; CAS&#xff0c;全称CompareAndSwap&#xff0c;比较并替换。 CAS包含了三个…

MyBatis --- 缓存、逆向工程、分页插件

一、MyBatis的缓存 1.1、MyBatis的一级缓存 一级缓存是SqlSession级别的&#xff0c;通过同一个SqlSession查询的数据会被缓存&#xff0c;下次查询相同的数据&#xff0c;就会从缓存中直接获取&#xff0c;不会从数据库重新访问 使一级缓存失效的四种情况&#xff1a; 1、…

MySQL高级第十二篇:数据库事物概述和隔离级别

MySQL高级第十二篇&#xff1a;数据库事物概述和隔离级别一、数据库事物概述1. SHOW ENGINES 查看存储引擎2. 事物ACID特性原子性&#xff08;atomiity&#xff09;一致性&#xff08;consistency&#xff09;&#xff1a;隔离性&#xff08;isolation&#xff09;持久性&#…

使用java实现自动扫雷

写在前面 本项目已在github开源&#xff0c;链接https://github.com/QZero233/JavaAutoMinesweeper 本文的写作风格可能会有些奇怪&#xff0c;这是笔者的一次全新的尝试&#xff0c;后续会换回写blog的文风的 摘要 本文提出了一个全自动完成扫雷游戏的解决方案&#xff0c;…

【Kubernetes】 多云管理策略解析

文章目录Kubernetes 多云的实现1. 前言1.1 Kubernetes 多云的现实需求2. Kubernetes 多云的架构设计2.1 跨云 Kubernetes 的挑战2.1.1 不同云厂商的接口不兼容2.1.2 多云环境中的安全问题2.1.3 跨云环境中的网络问题2.2 Kubernetes 多云的架构设计2.2.1 统一网络管理2.2.2 使用…

新能源汽车高压配电管理(PDU/BDU)

一、概念与组成 PDU(Power Distribution Unit)&#xff0c;即高压配电单元&#xff0c;功能是负责新能源车高压系统中的电源分配与管理&#xff0c;为整车提供充放电控制、高压部件上电控制、电路过载短路保护、高压采样、低压控制等功能&#xff0c;保护和监控高压系统的运行…