当前位置: 首页 > news >正文

项目中使用到的Spring注解及其作用

启动类相关注解

项目中的启动类

@SpringBootApplication 背后到底是什么? 

@SpringBootApplication注解实际上是SpringBoot提供的一个复合注解,看源码:

很清楚,其是一个合成体,但其中最重要的三个注解分别是:

  • @SpringBootConfiguration

  • @EnableAutoConfiguration

  • @ComponentScan

 如果不怕麻烦,在 SpringBoot 应用的启动类上用这个三个注解代替@SpringBootApplication 注解发现也是没问题的:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class TestSpringBootApplication {
    ...
}

@SpringBootConfiguration 

这说明 @SpringBootConfiguration 也是来源于 @Configuration,二者功能都是将当前类标注为配置类,并将当前类里以 @Bean 注解标记的方法的实例注入到srping容器中,实例名即为方法名。

至于@Configuration,作用是配置Spring容器,也即 JavaConfig 形式的 Spring IoC 容器的配置类所使用。

@EnableAutoConfiguration

@EnableAutoConfiguration 注解启用自动配置,其可以帮助 SpringBoot 应用将所有符合条件的 @Configuration 配置都加载到当前 IoC 容器之中,可以简要用图形示意如下:

从宏观一点的角度 概括总结 上述这一过程那就是:

从 ClassPath下扫描所有的 META-INF/spring.factories 配置文件,并将spring.factories 文件中的 EnableAutoConfiguration 对应的配置项通过反射机制实例化为对应标注了 @Configuration 的形式的IoC容器配置类,然后注入IoC容器。

@ComponentScan

@ComponentScan 对应于XML配置形式中的 <context:component-scan>,用于将一些标注了特定注解的bean定义批量采集注册到Spring的IoC容器之中,这些特定的注解大致包括:

  • @Controller
  • @Entity
  • @Component
  • @Service
  • @Repository

等等

对于该注解,还可以通过 basePackages 属性来更细粒度的控制该注解的自动扫描范围,比如:

@ComponentScan(basePackages = {"cn.codesheep.controller","cn.codesheep.entity"})

 此部分参考此文章https://www.jianshu.com/p/9dc7a385d19e --@SpringBootApplication注解背后的三体结构探秘

此部分参考文章:

一个面试题引起的SpringBoot启动解析 - 掘金-----很不错

Spring容器启动流程(源码解读) - 掘金---果然很源码,看着很懵

SpringBoot 应用程序启动过程探秘 - 掘金---细致总结

SpringBoot 中启动 Tomcat 流程 - 掘金---Tomcat相关

从Spring启动过程来理解IoC、AOP和bean的生命周期 - 掘金----宏观学习

@Configuration

由于上面的@SpringBootConfiguration注解底层主要使用的是@Configuration,那么,再来深入理解下@Configuration。

JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration,SpringBoot社区推荐使用基于JavaConfig的配置形式,所以,这里的启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类。

任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类。
任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。

可以看到@Configuration的底层是@Component,但是两者又有不同

 

一个面试题引起的SpringBoot启动解析 - 掘金-----有一部分参考

原创 | 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration - 掘金----这篇最棒

Spring注解中@Configuration、@Component、@Bean的用法区别 - 掘金

Spring中@Component和@Configuration的区别 - 掘金

SpringApplication.run做了哪些事?

SpringApplication.run一共做了两件事,分别是

  • 创建SpringApplication对象

  • 利用创建好的SpringApplication对象,调用run方法

1.创建SpringApplication对象

这个类中封装了程序的入口,!!!!!!!!!!!!!!!!!!!

2.调用run方法

【肥朝】面试官问我,SpringApplication.run做了哪些事? - 掘金-----简单理解版

SpringBoot 应用程序启动过程探秘 - 掘金----深入理解版

总结:

SpringApplication.run一共做了两件事,一件是创建SpringApplication对象,在该对象初始化时,找到配置的事件监听器,并保存起来.第二件事就是运行run方法,此时会将刚才保存的事件监听器根据当前时机触发不同的事件,比如容器初始化,容器创建完成等.同时也会刷新IoC容器,进行组件的扫描、创建、加载等工作.

41. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:

@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

@ComponentScan:Spring组件扫描。

42. 你如何理解 Spring Boot 中的 Starters?

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。

Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。

43. Spring Boot Starter 的工作原理是什么?

Spring Boot 在启动的时候会干这几件事情:

  • Spring Boot 在启动时会去依赖的 Starter 包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。
  • 根据 spring.factories 配置加载 AutoConfigure 类
  • 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context

总结一下,其实就是 Spring Boot 在启动的时候,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 Spring Boot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可

Spring总体
Spring Bean生命周期,好像人的一生。。 - 掘金
Spring IOC详解及Bean生命周期详细过程,看完直接吊打面试官! - 掘金


@Component

Spring中@Component和@Configuration的区别 - 掘金

@EnableRedisHttpSession
@Bean
@ControllerAdvice

Spring进阶之@ControllerAdvice与统一异常处理 - 掘金

@ControllerAdvice到底是怎么一回事? - 掘金

@ExceptionHandler

SpringBoot源码解析-ExceptionHandler处理异常的原理 - 掘金

@ResponseBody

RequestBody和ResponseBody踩坑 - 掘金

@RequestParam

常见的接口请求类型和@RequestBody、@RequestParam的使用 - 掘金

@Controller

如何优雅的写 Controller 层代码? - 掘金

Spring注解之@Component、@Controller、@Service、@Repository - 掘金

@RequestMapping

超详细 Spring @RequestMapping 注解使用技巧 - 掘金

@CrossOrigin

springMVC跨域请求@CrossOrigin - 掘金

@Autowired

Spring为啥不推荐使用@Autowired注解? - 掘金

你还在用@Autowired和@Resource? - 掘金

@PostConstruct

深入理解Spring IOC之扩展篇(三)、InitializingBean、@PostConstruct、SmartInitializingSingleton - 掘金
 

@PostConstruct注解,你该好好看看 - 掘金

@Service

@Autowired、@Resource、和@Service注解详解 - 掘金

为什么我的Service无法注入进来? - 掘金

@Transactional

一口气说出 6种,@Transactional注解的失效场景 - 掘金

相关文章:

  • Postgresql源码(86)varchar的创建与插入分析
  • VMware创建虚拟机及安装Linux操作系统
  • 基于51单片机的指纹考勤机密码锁系统
  • 科研小白上路的必备工具链
  • HTML5七夕情人节表白代码 (动态3D相册) HTML+CSS+JS
  • 【云原生 | 从零开始学istio】一、Istio介绍—服务网格
  • 花咲の姫君(異時層ツキハ) / 花咲(异时层妖刀)
  • 体系结构实验(6)—— Cache映射策略
  • 牛客网专项练习30天Pytnon篇第16天
  • 【DS】6.堆知识总结!!!
  • kali工具熟悉——存活主机识别
  • 剖释C++内存管理底层细节 | 明晰池化技术中内存管理的原理
  • LVGL v8学习笔记 | 10 - Tabview控件的使用方法
  • 【漏洞复现-dedecms-文件上传】vulfocus/dedecms-cve_2019_8933
  • 罗克韦尔AB PLC安装Studio5000提示未安装Microsoft .NET Framework 3.5的解决方法
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【Linux系统编程】快速查找errno错误码信息
  • C++类中的特殊成员函数
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Otto开发初探——微服务依赖管理新利器
  • ReactNative开发常用的三方模块
  • Redis 中的布隆过滤器
  • spring学习第二天
  • SQLServer插入数据
  • SSH 免密登录
  • Wamp集成环境 添加PHP的新版本
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 如何选择开源的机器学习框架?
  • 算法-图和图算法
  • 小而合理的前端理论:rscss和rsjs
  • 以太坊客户端Geth命令参数详解
  • ​油烟净化器电源安全,保障健康餐饮生活
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (力扣)循环队列的实现与详解(C语言)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (转)mysql使用Navicat 导出和导入数据库
  • .Net 6.0 处理跨域的方式
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 的程序集加载上下文
  • .NET 反射 Reflect
  • .NET 分布式技术比较
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NET4.0并行计算技术基础(1)
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • /var/spool/postfix/maildrop 下有大量文件
  • @Valid和@NotNull字段校验使用
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt