【十】我们都是面向spring注解开发的

news2024/9/20 14:30:10

spring 注解驱动开发

简介:

           前面有写过spring框架的演进历程,得出一个结论就是我们都是面向spring编程的,这里讲另一个结论:我们都是面向spring注解开发的。spring框架的核心设计理念是简化java开发,而这一路的发展越来越多的是基于注解的方式,本篇博客讲介绍一下spring注解驱动开发。

一、注解

        讲解本文主题之前我们需要了解一下注解,从JDK5.0新增了注解(Annotation),也叫元数据。与类、接口、枚举是在同一个层次,它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

        这里我们了解一下元注解的概念,元注解是用于修饰其它注解的注解,如下所示有四种元注解:

        @Documented:指定了被修饰的注解是可以Javadoc等工具文档化
        @Retention:指定了被修饰的注解的生命周期
        @Target:指定被修饰的注解的作用范围
        @Inherited:指定了被修饰的注解修饰程序元素的时候是可以被子类继承的

        我们自定义注解的时候必须标注这些元注解,另外定义好注解之后我们还需要有注解解析器去使用定义的注解。

二、注解使用的场景

         平时我们在做J2EE开发的时候都是采用的mvc的架构,其中如下图简单demo所示:

        以上展示的代码的写法我们再熟悉不过了,可以看出来一套下来都是基于注解的方式。这里只是写了个简单的demo,spring只从引入了JavaConfig之后,我们的配置也从xml配置文件也被替代了,这样一来,J2EE开发过程就可以完全以基于注解的方式开发了。

三、常用注解

        上面阐述了基于spirng注解这一开发现状,本节将总结一下我们在开发过程中常用的注解和作用。以下根据注解的功能分类介绍一下常用的注解。

1、Spring Bean类的注解

@Controller

对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。

@RestController

@RestController = @Controller + @ResponseBody  这是一个组合的注解,这样控制层我们就不用写两个注解了

@Service

标注业务应用层,主要涉及一些复杂的逻辑,需要用到 Dao 层。

@Component

通用的注解,可标注任意类为 Spring Bean。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。

@Repository

对应持久层即 Dao 层,主要用于数据库相关操作。我们在日常开发中也使用mybatis的@Mapper注解。

@Configuration

用来声明配置类,这就是上面提到的JavaConfig,也就是使用Java类替代了Xml配置文件,通常配置类里会结合@Bean注解声明对象,把返回的对象注入到容器中

2、request常用注解

@RequestMapping

它用于映射客户端的访问地址,可以被应用于类和方法上面。

可以指定请求的类型get,post,put,delete

@GetMapping

等价于@RequestMapping(value="",method=RequestMethod.GET)

@PostMapping

等价于@RequestMapping(value="",method=RequestMethod.POST)

@PutMapping(value="/users/{userId}")

等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)

@DeleteMapping("/users/{userId}")

等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)

3、前后端传参

@PathVariable

用于获取路径参数,通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中。

@RequestParam

用于controller层,是Spring的注解,用于获取查询参数,解决前台参数名称与后台接收参数变量名称不一致的问题。

@Param

用于dao层,是mybatis中的注解。

使得mapper.xml中的参数与后台的参数对应上,也增强了可读性。

4、实体类相关注解

@Entity

声明一个类对应一个数据库实体

 @Table

@Table注解默认情况下只会完成表和实体之间的映射,声明才对象映射到数据库的数据表,通过它可以为实体指定表(table)。

常用属性:name 指定表 @Table(name = "test")

@Id

声明一个字段为主键。所有的实体类都要有主键,@Id注解表示该属性是一个主键。

@Column

声明字段,可以设置字段的属性,字段名、是否为空。

生成的表中字段的名称就是实体类中属性的名称,通过@Column注解可以定制生成的字段属性,name表示该属性对应的数据表中字段的名称,nullable表示该字段非空。

@Transient

声明不需要与数据库映射的字段,在保存的时候不需要保存进数据库。

@Transient注解表示在生成数据库中的表时,该属性被忽略,即不生成对应的字段

5、注入数据注解

@Autowired

自动按照类型注入,只要容器中有唯一一个 bean 对象类型和要注入的变量类型匹配,就可以注入成功。

如果有多个类型匹配,先匹配类型,然后根据变量名称去对应,如果变量名称和 bean 名称相同,就注入。

@Resource

默认使用byName方式,就是根据变量名去匹配bean的id属性,而byType则是变量类型去匹配bean的class属性。

@Autowired和@Resource的区别:

@Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的;
@Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入;
@Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,表示忽略当 前要注入的bean,如果有直接注入,没有则会跳过,不会报错

@Value

用于注入基本类型和 String 类型的数据

6、事务注解

@Transactional:事务注解,注解一般用在可以作用在类或者方法上

7、AOP注解

@After 在方法执行之后执行

@Before 在方法执行之前执行

@Around 在方法执行之前与之后执行

@AfterReturning当前方法作为返回后通知

@AfterThrowing当前方法作为异常后通知

@Aspect:声明一个切面

@PointCut:声明切点

@EnableAspectJAutoProxy:开启Spring对AspectJ代理的支持

总结

        本篇博客主要是讲述了我们平常开发都是基于注解的方式进行的,这也是J2EE开发技术发展现阶段的情况,注解的作用是标记,对于业务来说侵入性非常低,同时使用上灵活性非常高,相对于之前xml配置的方式,基于注解驱动开发更加灵活了。

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

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

相关文章

超分辨率重建——SAN训练自己数据集及推理测试(详细图文教程)

目录 一、源码包下载二、数据集准备三、预训练权重文件四、训练环境五、训练5.1 超参数修改5.2 训练模型5.2.1 命令方式训练5.2.2 Configuration配置参数方式训练 5.3 模型保存 六、推理测试6.1 超参数修改6.2 测试6.2.1 命令方式测试6.2.2 Configuration配置参数方式测试 6.3 …

TCP报文头(首部)详解

本篇文章基于 RFC 9293: Transmission Control Protocol (TCP) 对TCP报头进行讲解,部分内容会与旧版本有些许区别。 TCP协议传输的数据单元是报文段,一个报文段由TCP首部(报文头)和TCP数据两部分组成,其中TCP首部尤其重…

node.js mongoose简述

目录 官方文档 mongoose Schema Model Query document 关系 官方文档 Mongoose v8.0.3: Getting Started mongoose Mongoose 是一个 Node.js 环境下 MongoDB 的对象建模工具。它提供了一种在应用程序中与 MongoDB 数据库进行交互的方式,使得开发者能够使用…

怎么使用会声会影?2024年最新使用会声会影的具体步骤

一听说视频剪辑我们就不由得联想到电影、电视等一些高端的视频剪辑技术,大家都觉得视频剪辑是一个非常复杂而且需要很昂贵的设备才可以完成的技术活,这对很多“门外汉”来说都可望而不可及。实际上,使用会声会影剪辑视频不仅是很多人都可以操…

哈希扩展:位图与布隆过滤器

目录 1. 位图1.1 位图引入1.2 位图概念1.3 位图的模拟实现1.4 位图相关问题1.5 位图的应用 2. 布隆过滤器2.1 布隆过滤器概念2.2 模拟实现2.3 布隆过滤器相关问题2.3.1 哈希切分 1. 位图 1.1 位图引入 给40亿个不重复的无符号整数,没排过序。给一个无符号整数&…

Java 基础学习(十二)文本I/O、日期与时间API

1 文本 I/O 1.1 字符流 1.1.1 什么是字符流 在Java中,字符流是指提供了基于字符的I/O能力的API。 Java 1.0中提供的基于字节的I/O流API只能支持8位字节流,无法妥善地处理16位Unicode字符。由于需要支持Unicode处理国际化字符,因此Java 1.…

网络安全——Iptables防DDoS攻击实验

一、实验目的要求: 二、实验设备与环境: 三、实验原理: 四、实验步骤: 五、实验现象、结果记录及整理: 六、分析讨论与思考题解答: 一、实验目的要求: 1、掌握常见DDoS攻击SYN Flood的攻击…

Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)

A - Three Threes 题目大意:给你一个整数n,将这个数n输出n次。 呃呃 B - Pentagon 题目大意:给你一个正五边形ABCDE,给你任意两条边,判断是否相等 主要问题要判断一下内边:AD,AC,…

小 cookie,大作用:探索网站中的隐私追踪器(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

用Flask搭建简单的web模型部署服务

目录结构如下: 分类模型web部署 classification.py import os import cv2 import numpy as np import onnxruntime from flask import Flask, render_template, request, jsonifyapp Flask(__name__)onnx_session onnxruntime.InferenceSession("mobilen…

【图的应用一:最小生成树】- 用 C 语言实现普里姆算法

目录 一、最小生成树 二、普里姆算法的构造过程 三、普里姆算法的实现 一、最小生成树 假设要在 n 个城市之间建立通信联络网,则连通 n 个城市只需要 n - 1 条线路。这时,自然会考虑这样一个问题,如何在最节省经费的前提下建立这个通信…

云仓酒庄的品牌雷盛红酒分享红酒里加二氧化硫有害吗?

雷盛葡萄酒是广州万豪酒业有限公司旗下主力葡萄酒品牌,该品牌由云仓酒庄负责全国运营。雷盛(LEESON)品牌系列葡萄酒有幸邀请著名导演张纪中先生担任品牌代言人。采用多国家采购、多葡萄酒品种、多价位区间的全系列整体品牌形式,让…

谷达冠楠科技:抖音网店到底怎么做靠谱

随着互联网的发展,越来越多的人开始尝试在网上开设自己的店铺。而在众多的电商平台中,抖音网店无疑是近年来最受年轻人欢迎的一种方式。那么,抖音网店到底怎么做才能靠谱呢? 首先,我们需要明确一点,无论是在哪个平台上…

JS对象笔记

对象声明 对象也只是一种数据类型/字面值。写对象这个字面值有两种写法,一种是普通的对象,这种对象用new 构造函数(),另一种是JS内特有的json对象。这个对象是直接{}就代表对象。且也是在堆内。 对象的构成 无论是上…

Pytorch当中的.detach()操作是什么意思

.detach() 是 PyTorch 中用于从计算图中分离张量的方法。当我们在PyTorch中进行张量运算时,操作会构建一个计算图来跟踪计算历史,这个计算图用于自动求导和反向传播来计算梯度。 使用.detach()方法可以将一个张量从当前的计算图中分离出来,使…

System作为系统进程陔如何关闭?

一、简介 system进程是不可以关闭的,它是用来运行一些系统命令的,比如reboot、shutdown等,以及用来运行一些后台程序,比如ntfs-3g、v4l2loopback等。system进程也被用于运行一些内核模块,比如nvidia、atd等。system进程…

太阳能电池特性测试用太阳光模拟器24H光源

概述 太阳能模拟器是一种在室内模拟太阳光的设备,能够较为准确地模拟太阳辐射的准直性、均匀性和光谱特性。它的基本原理是利用人工光源模拟太阳光辐射,以克服太阳光辐射受环境、时间和气候等因素影响,并且总辐照度不能调节等缺点&#xff0c…

c++ websocket 协议分析与实现

前言 网上有很多第三方库,nopoll,uwebsockets,libwebsockets,都喜欢回调或太复杂,个人只需要在后端用,所以手动写个; 1:环境 ubuntu18 g(支持c11即可) 第三方库:jsoncpp,openssl 2:安装 jsoncpp 读取json 配置文件 用 自动安装 网…

【Redis】远程访问配置教程与远程客户端连接测试

前言 Redis 是一种基于内存的高性能键值存储数据库,常用于缓存、会话管理和实时数据分析等场景。在默认情况下,Redis 不允许远程连接,为了进行远程连接,需要进行一些配置和操作。接下来将介绍如何修改配置文件以允许远程连接&…

毅速:3D打印随形水路 提高良品率和生产效率的新利器

随着科技的不断发展,3D打印技术已经成为模具制造领域的一种重要技术。其中,模具随形水路的设计和制造是提高注塑产品良品率和生产效率的关键环节。 模具随形水路是一种根据产品形状设计的水路,可以更靠近产品,并在模具内热点集中区…