Spring常见的注解

前言

在当今的软件开发领域,Spring框架已经成为了Java开发中不可或缺的重要工具之一。其优秀的设计和丰富的功能使得开发者能够更加高效地构建出稳健、可扩展的企业级应用程序。而Spring框架的注解机制,则是其灵活性和便捷性的重要体现之一。

本文将深入探讨Spring框架中常用的注解,分析其功能和用法,并结合实例进行详细说明。通过学习和理解这些注解,读者将能够更好地利用Spring框架的强大功能,提高自己的开发效率和代码质量。

1.组件扫描和声明相关的注解

@Component:通用组件注解表明是受spring管理的组件。

     三个Component的按三层架构分类的三个衍生注解(功能完全相同):

        @Controller:控制层

        @Service:业务层

        @Repository:数据层

2.依赖注入相关注解

@Autowried:按类型自动装配bean,底层使用了暴力反射,没有setter方法也可以注入

        @Qualifier:配合Autowried使用,如果多个该类型的bean,使用该注解声明名称注入

        @Primary:配合AutoWried使用,如果多个该类型的bean,声明本注解的bean为主要的bean

@Resource:自动装配,按照名称注入,名称不存在按照类型注入
下面说说二者之间的差异:

        实现方式不同:上述已经讲解注入的类型

        兼容性:

  • @Autowired:是 Spring 提供的注解,依赖于 Spring 框架,对 Java EE 平台没有依赖。
  • @Resource:是 Java EE 规范提供的注解,在 Java EE 平台上具有更好的兼容性,但也可以在 Spring 中使用。

3.配置相关注解

@Configuration:定义该类是一个配置类,代替了xml的配置文件。

@Bean:用于管理第三方bean,主要用于将第三方库或外部组件集成到 Spring 应用程序中。

原理:

当 Spring 应用启动时,Ioc容器会扫描所有的配置类,识别其中的 @Bean 注解,并根据这些注解定义的方法来创建对应的 Bean。主要是原理还是反射来创建配置类的对象,在反射@Bean注解的方法,然后将方法的返回值的对象注册为bean,从而完成 Bean 的定义和加载过程。

@ComponentScan:扫描@Component配置的bean,扫描到了就注册到Ioc容器,参数为扫描路径。
@Import:实现组件化开发,用来在 Spring 配置类中引入其他配置类或普通类,并将其中声明的 Bean 导入到当前配置类中。
@EnableAspectJAutoProxy:告诉 Spring 启用基于注解的 AOP 支持

@Conditional:可以根据条件动态地决定某个 Bean 是否被创建,从而实现配置的灵活性。
@Lazy:  声明bean是否延时加载。1.在配置类注解上配置类中所有的 @Bean 方法,2.在@Bean方法上,表示第三方延时加载,3.在@Compoent组件上,表明该组件是一个延时加载bean

        延时加载bean:bean的延时加载就是使用到bean的时候再去加载

        非延时加载bean:在 Spring 容器启动时会立即进行实例化和初始化,无论是否在应用中被使用。这意味着当 Spring 容器启动时,非延迟加载的 Bean 将被创建,并准备好在需要时立即使用。
@PropertySource

  • 用于指定外部属性文件的位置。
  • 可以通过 value 属性指定属性文件的路径。
  • 在属性文件中定义的属性可以通过 @Value 注解注入到 Bean 的属性中。

4.配置注入相关的注解 

@Value: 注入属性值,通常从配置文件中读取。 

5.Aop相关的注解、

 作用:在不惊动原始设计的基础上做功能增强。这就是spring的无侵入式编程。

  1. @Aspect: 声明一个切面。
  2. @Pointcut: 定义一个切入点。
    @Pointcut("execution(* com.example.UserService.*(..))")定义一个切入点表达式
  3. @Before: 在方法执行前执行通知。
  4. @AfterReturning: 在方法执行后返回结果后执行通知。
  5. @AfterThrowing: 在方法抛出异常后执行通知。
  6. @Around: 包围一个方法的通知

         这个是五大通知中最重要的方法,可以动态的声明在方法执行前还是执行后
 

public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("环绕通知前");Object ret = pjp.proceed();System.out.println("环绕通知后");return ret;
}

 AOP的主要原理:

动态代理,获取bean是代理对象的时候,会根据代理对象的运行模式,运行原始方法与增加的内容完成操作。

6.Web相关注解: 

  • @Controller: 标识一个类为MVC控制器。
  • @RequestMapping: 映射HTTP请求到处理方法。
  • @ResponseBody: 将方法的返回值直接写入HTTP响应体中。
  • @PathVariable: 获取请求路径中的参数值。
  • @RequestParam: 获取请求参数的值。
  • @ResponseStatus: 设置HTTP响应的状态码和原因

7.事务相关的注解 

  • @Transactional: 声明一个方法或类为事务性操作。
     
  • @EnableTransactionManagement: 启用 Spring 的事务管理功能。
     
  • @ReadOnly: 声明一个方法是只读的,即不会修改数据库中的数据,可用于优化性能。
     
  • @Propagation: 用于定义事务的传播行为,包括 REQUIREDSUPPORTSMANDATORYREQUIRES_NEWNOT_SUPPORTEDNEVER 和 NESTED
  • @Propagation.REQUIRED: 指定方法必须在一个事务中执行,如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • @Propagation.REQUIRES_NEW: 指定方法必须在一个新的事务中执行,如果当前存在事务,则挂起该事务。

总结

Spring框架中的注解为开发者提供了一种便捷、灵活的编程方式,大大简化了开发过程。通过本文的介绍,我们了解了各种功能分类下的常用注解,包括依赖注入、组件扫描与声明、配置、属性注入、AOP、Web等方面的注解,并通过实例进行了详细讲解。

掌握Spring框架中的注解,可以使开发者更加轻松地实现各种功能,提高代码的可读性和可维护性。希望本文能够对读者在Spring框架的学习和应用中起到一定的指导作用,为他们的项目开发提供帮助和启发。

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

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

相关文章

RPA的全新形态—Agent智能体:当机器人开始“听”话

随着人工智能技术的不断进步,RPA正迈向其全新形态——Agent智能体。想象一下,如果你的日常工作中有一个智能助手,它不仅能理解你的需求,还能自动帮你完成那些繁琐的任务,这会是怎样的体验?这就是RPA技术正在…

SpringBoot+Mock Mvc测试web接口增删改查、导入导出

需求&#xff1a; 使用Mock Mvc单元测试web接口的增删改查、导入、导出功能&#xff0c;涵盖登录 token header赋值等全流程 1&#xff0c;引入核心依赖 <!-- 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifac…

从零创建一个vue2项目

标题从零创建一个vue2项目&#xff0c;项目中使用TensorFlow.js识别手写文字 npm切换到淘宝镜像 npm config set registry https://registry.npm.taobao.org安装vue/cli -g npm install -g vue/cli检查是否安装成功 vue -V创建项目 vue create 项目名安装TensorFlow npm …

RAC中Voting盘相关总结

一、概述 在Oracle RAC&#xff08;Real Application Clusters&#xff09;环境中&#xff0c;"voting盘" 是用于存储集群的心跳信息和状态信息的特殊磁盘。每个节点都可以访问并共享此磁盘上的数据。voting盘在Oracle RAC中扮演着至关重要的角色&#xff0c;用于维护…

cpp笔记-24-05-10

1、public —— 外部也能访问 2、private —— 只能内部&#xff08;友元也可以&#xff09; 3、explicit —— 只可用于声明単参构造函数。声明类的构造函数是显示调用&#xff0c;不是隐式。阻止调用构造函数时隐式转换&#xff08;赋值初始化&#xff09; 4、默认构造函数…

Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之触控开关二

Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之触控开关二 1.概述 这篇文章在触摸屏上绘制一个开关&#xff0c;通过点击开关实现控制灯的开关功能。 2.硬件 硬件连接参考第一篇文章介绍 Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之获取触控坐标一 3.实现…

在线caj转换成pdf免费吗?caj变成pdf很容易!点进来!

在数字化阅读日益盛行的今天&#xff0c;各种电子文献格式层出不穷&#xff0c;其中CAJ和PDF无疑是两种最为常见的格式。CAJ是中国知网推出的一种专用全文阅读格式&#xff0c;而PDF则因其跨平台、不易被修改的特性&#xff0c;受到了广大读者的青睐。因此&#xff0c;将CAJ格式…

Auto.js如何打包成APK文件

Auto.js 是一个基于 JavaScript 的自动化脚本工具&#xff0c;它可以被打包成 APK 文件&#xff0c;以便在 Android 设备上安装和运行。以下是根据您提供的搜索结果中关于如何将 Auto.js 脚本打包成 APK 文件的步骤&#xff1a; 1. **安装 Auto.js App**&#xff1a;首先&…

【C++】 类的新成员:static成员和类的好朋友:友元

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a; 类的新成员&#xff1a;static成员和类的好朋友&#xff1a;友元 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Li…

网络编程套接字(一) 【简单的Udp网络程序】

网络编程套接字<一> 理解源端口号和目的端口号PORT VS PID认识TCP协议和UDP协议网络字节序socket编程接口sockaddr结构简单的UDP网络程序服务端创建套接字服务端绑定运行服务器客户端创建套接字关于客户端的绑定问题启动客户端启动客户端本地测试INADDR_ANY 理解源端口号…

怎么给视频加水印?2招轻松搞定

在数字媒体时代&#xff0c;视频水印作为一种有效的版权保护手段&#xff0c;被广泛应用于各种场景。给视频添加水印不仅可以防止内容被恶意盗用&#xff0c;还能增加视频的辨识度&#xff0c;提升品牌形象。本文将为您介绍2种简单易行的方法&#xff0c;教您怎么给视频加水印&…

Linux进程控制——Linux进程等待

前言&#xff1a;接着前面进程终止&#xff0c;话不多说我们进入Linux进程等待的学习&#xff0c;如果你还不了解进程终止建议先了解&#xff1a; Linux进程终止 本篇主要内容&#xff1a; 什么是进程等待 为什么要进行进程等待 如何进程等待 进程等待 1. 进程等待的概念2. 进…

软件杯 深度学习的水果识别 opencv python

文章目录 0 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习…

【数据结构】平衡二叉树(插入、查找、删除)解析+完整代码

3.2 平衡二叉树 3.2.1 定义 平衡二叉树&#xff0c;简称平衡树&#xff08;AVL树&#xff09; 树上任一结点的左右子树高度差不超过1。 结点的平衡因子左子树高-右子树高 3.2.2 插入操作 插入结点后&#xff0c;可能造成不平衡 要调整最小不平衡子树&#xff0c;使其恢复平衡。…

武装部三维电子沙盘-行动路径规划分析平台

武装部三维电子沙盘-行动路径规划分析平台是一款集成了大数据、云计算、虚拟现实、物联网、AI等先进技术的综合性系统。它真实模拟地形、地貌、地物&#xff0c;结合地理空间专业数据、执勤兵力部署、基干民兵信息、普通民兵信息、潜力资源信息、军队相关专业数据、兵要地志数据…

【回溯 代数系统】679. 24 点游戏

本文涉及知识点 回溯 代数系统 LeetCode679. 24 点游戏 给定一个长度为4的整数数组 cards 。你有 4 张卡片&#xff0c;每张卡片上都包含一个范围在 [1,9] 的数字。您应该使用运算符 [‘’, ‘-’, ‘*’, ‘/’] 和括号 ‘(’ 和 ‘)’ 将这些卡片上的数字排列成数学表达式…

SQLserver - 笔记

1 SQLserver - 用户管理 4、SQL SERVER数据库用户管理_哔哩哔哩_bilibili 创建用户 - user 2.选择用户&#xff0c;修改属性

Qt---绘图和绘图设备

一、QPainter绘图 绘图事件 void paintEvent() 声明一个画家对象&#xff0c;OPainter painter(this) this指定绘图设备 画线、画圆、画矩形、画文字 设置画笔QPen 设置画笔宽度、风格 设置画刷QBrush 设置画刷风格 代码示例&#xff1a; #includ…

LeetCode---循环队列

循环队列就是只有固定的内存&#xff0c;存数据&#xff0c;出数据&#xff0c;但是也和队列一样&#xff0c;先进先出。如下图所示&#xff0c;这是他的样子 在head出&#xff0c;tail进&#xff0c;但是这个如果用数组解决的话&#xff0c;就有问题&#xff0c;力扣给我们的接…

libx265的交叉编译

目标平台&#xff1a;aarch64 编译器版本&#xff1a;aarch64-linux-gnu- 操作系统&#xff1a;麒麟v10 CPU&#xff1a;rk3588 为了方便编译aarch64版本&#xff0c;建议x265版本选择3.5版本&#xff0c;此版本build中包含了aarch64配置选项&#xff0c;比较码放。下载地…