小白速通 Spring 之 Annotation 篇

news2024/9/23 6:24:13

Annotation

注解

@Service
public class MessageServiceImpl implements MessageService{

    public String getMessage() {
         return "Hello World!";
    }

}  

在这里插入图片描述

本质上来说 Annotation(注解)是 Java 推出的一种注释机制,后面我们统一叫 Annotation,和普通的注释有个显著的特别,那就是Annotation 是可以在编译、运行阶段读取的,注释很明显不可以。
能够在编译、运行阶段读取信息,这就给了我们很多的扩展空间,而且不会污染源代码。我们可以借助它来实现一些增强功能,在Spring当中就重度使用了 Annotation,通过运行阶段动态的获取Annotation 从而完成很多自定义的行为,所以如果不了解Annotation,那学习 Spring 就没有办法进行下去了。
从另外一个角度来看,Annotation 也是一个 Java 类,只是这个类太特殊了点。我们可以先看看上面的 Service 这个 Annotation 的源代码

  1. @Target
    java.lang.annotation.Target 自身也是一个注解,它只有一个数组属性,用于设定该注解的目标范围,比如说可以作用于类或者方法等。因为是数组,所以可以同时设定多个范围

    具体可以作用的类型配置在 java.lang.annotation.ElementType 枚举类中,我们说几个常用的

    • ElementType.TYPE

      可以作用于 类、接口类、枚举类上

    • ElementType.FlELD

      可以作用于类的属性上

    • ElementType.METHOD

      可以作用于类的方法上

    • ElementType.PARAMETER

      可以作用于类的参数

如果想要同时作用于类和方法上,可以:

@Target({ElementType.TYPE,ElementType.METHOD})

如果某个Annotation的Target设定为METHOD,那就只能在方法上引用,其他Target也类似

例子

  1. 1 ElementType.TYPE
@Service
public class MessageServiceImpl implements MessageService{

    public String getMessage() {
         return "Hello World!";
    }

}
  1. 2 ElementType.METHOD
public class MessageServiceImpl implements MessageService{

    @ResponseBody
    public String getMessage() {
         return "Hello World!";
    }

}
  1. 3 ElementType.FIELD
public class MessageServiceImpl implements MessageService{

    @Autowired
    private WorkspaceService workspaceService;

}
  1. 4 ElementType.PARAMETER
public class MessageServiceImpl implements MessageService{

    public String getMessage(@RequestParam("msg")String msg) {
         return "Hello "+msg;
    }

}
  1. @Retention

java.lang.annotation.Retention自身也是一个注解,它用于声明该注解的生命周期,简单的来说就是在 Java 编译、运行的哪个环节有效,它的值定义在 java.lang.annotation.RetentionPolicy 枚举类中,有三个值可以选择

  1. SOURCE: 也就是说是纯注释作用

  2. CLASS: 也就是在编译阶段是有效的

  3. RUNTIME: 在运行时有效

    @Retention(RetentionPolicy.RUNTIME)
    

这个代码表示的就是在运行期间有效

如果是我们自己定义的 Annotation ,一般我们都会设置成
RUNTIME

  1. @Documented
    自身也是一个注解,它的作用java.lang.annotation.Documented是将注解中的元素包含到 JavaDoc 文档中,一般情况下,都会添加这个注解的。

  2. @interface
    @interface 就是声明当前的 Java 类型是 Annotation,固定语法就是这样写就好

  3. Annotation 属性

String value() default "";

Annotation 的属性有点像类的属性一样,它约定了属性的类型(这个类型是基础类型:String、boolean、int、long),和属性名称(默认名称是 value ,在引用的时候可以省略),default 代表的是默认值。

有了这个属性,我们就可以正式的引用一个 Annotation 啦,比如

import org.springframework.stereotype.Service;

@Service
public class Demo {

}

注意,Annotation 也是 Java 类,所以一样需要 import 的
上面的 @service 也可以写成

import org.springframework.stereotype.Service;

@Service(value="Demo")
public class Demo {

}

因为我们说过 value 是默认属性名称是可以缩写的,所以上面的代码
等同于

import org.springframework.stereotype.Service;

@Service("Demo")
public class Demo {

}

Annotation 属性是可以有多个的,比如下面的一个注解类

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {

    @AliasFor("name")
    String value() default "";


    @AliasFor("value")
    String name() default "";


    boolean required() default true;

    String defaultValue() default ValueConstants.DEFAULT_NONE;
}

在属性的代码上,我们看到@AliasFor("name")这个是别名的意思就是说这个属性用这个别名也可以访问到,所以下面的代码是一样的意思

@RequestParam("key")
@RequestParam(value="key")
@RequestParam(name="key")

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

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

相关文章

Python设计模式:巧用元类创建单例模式!

✨ 内容: 今天我们来探讨一个高级且实用的Python概念——元类(Metaclasses)。元类是创建类的类,它们可以用来控制类的行为。通过本次练习,我们将学习如何使用元类来实现单例模式,确保某个类在整个程序中只…

python-首字母移位(PythonTip)

[题目描述] 编写一个程序,将句子中每个单词的首字母移位到下一个单词。定义函数shift_first_letter(),参数为sentence(字符串)。在函数内,将句子中每个单词的首字母移位到下一个单词。最后一个单词的首字母移位到句子的…

Hadoop架构

一、案列分析 1.1案例概述 现在已经进入了大数据(Big Data)时代,数以万计用户的互联网服务时时刻刻都在产生大量的交互,要处理的数据量实在是太大了,以传统的数据库技术等其他手段根本无法应对数据处理的实时性、有效性的需求。HDFS顺应时代…

【机器学习】模型验证曲线(Validation Curves)解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 模型验证曲线(Validation Curves)解析什么是模型验证曲线?模型验证曲线的解读模…

Django教程(004):基于orm操作数据库的用户管理实现

文章目录 1、功能需求2、展示用户列表2.1 添加url2.2 创建视图2.3 编写html页面 3、添加用户3.1 添加url3.2 跳转到添加页面3.3 编写添加用户页面3.4 添加用户3.5 实现效果3.6 页面优化 4、删除用户4.1 添加删除用户按钮4.2 添加删除url4.3 删除用户4.4 实现效果 5、完整代码链…

vue3使用html2canvas

安装 yarn add html2canvas 代码 <template><div class"container" ref"container"><div class"left"><img :src"logo" alt"" class"logo"><h2>Contractors pass/承包商通行证&l…

StableDiffusion模型推荐系列(风格型)

今天&#xff0c;分享几个SDXL的特殊风格模型&#xff0c;这些模型在特定风格下非常出彩&#xff0c;弥补了一些“我已经看腻了AI画图”的情况。这几位作者分享的SDXL模型艺术风格上表现得尤为出色&#xff0c;而且他们都是秉持着开源精神免费分享自己的模型。训练过模型的小伙…

掌握VR全景技术,需要具备哪些条件?

VR全景技术自从进入市场以来&#xff0c;就在各个行业领域尝试落地运用&#xff0c;包括但不限于广告宣传、学校教育、医疗、工业、农业等领域。随着5G 技术的不断普及&#xff0c;VR全景技术也逐渐被应用到日常生活中的各个方面&#xff0c;从地产中介到车企销售&#xff0c;从…

单周期CPU(三)译码模块(minisys)(verilog)(vivado)

timescale 1ns / 1ps //module Idecode32 (input reset,input clock,output [31:0] read_data_1, // 输出的第一操作数output [31:0] read_data_2, // 输出的第二操作数input [31:0] Instruction, // 取指单元来的指令input [31:0] …

ubuntu配置ssh服务器详解

① 确定Ubuntu是否安装SSH服务 systemctl status ssh 一般最开始都没有ssh服务 ② 安装SSH Server sudo apt install openssh-server 执行过程如下 ③ 确定Ubuntu SSH服务状态 systemctl status ssh 现在能看到&#xff1a; 第一行加载状态&#xff0c;已加载ssh.service文件…

大语言模型-GPT-Generative Pre-Training

一、背景信息&#xff1a; GPT是2018 年 6 月由OpenAI 提出的预训练语言模型。 GPT可以应用于复杂的NLP任务中&#xff0c;例如文章生成&#xff0c;代码生成&#xff0c;机器翻译&#xff0c;问答对话等。 GPT也采用两阶段的训练过程&#xff0c;第一阶段是无监督的方式来预训…

使用 Redis 实现验证码、token 的存储,用自定义拦截器完成用户认证、并使用双重拦截器解决 token 刷新的问题

基于session实现登录流程 1.发送验证码 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff0c;如果不合法&#xff0c;则要求用户重新输入手机号 如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行保存&#xff0c;然后再通过短信…

Python爬虫实战案例(爬取图片)

爬取图片的信息 爬取图片与爬取文本内容相似&#xff0c;只是需要加上图片的url&#xff0c;并且在查找图片位置的时候需要带上图片的属性。 这里选取了一个4K高清的壁纸网站&#xff08;彼岸壁纸https://pic.netbian.com&#xff09;进行爬取。 具体步骤如下&#xff1a; …

Android 性能之刷新率设置和管理

目录 1. 刷新率和帧率 2. 多种刷新率 3. 基本原理 3.1 屏幕 & 显示控制器 3.2 Composer Service 4. Framework 策略 4.1基本架构 4.2 刷新率设置项的定义 4.2.1 最低刷新率 4.2.2 默认刷新率 & 默认的用户设置刷新率 4.2.2.1 设置入口 4.2.2.2 设置场景 4…

Matlab画不同指标的对比图

目录 一、指标名字可修改 二、模型名字可修改 三、输入数据可修改 软件用的是Matlab R2024a。 clear,clc,close all figure1figure(1); % set(figure1,Position,[300,100,800,600],Color,[1 1 1]) axes1 axes(Parent,figure1);%% Initialize data points 一、指标名字可修…

zigbee DL-20无线串口模块(电赛备战)

zigbee DL-20无线串口模块(电赛备战) 备战2024电子设计大赛&#xff08;7.29-8.1&#xff09; 概述 DL-20是一款2.4G无线串口模块&#xff0c;支持点对点和广播模式的通信。它具备低数据丢失率、宽电压范围和高传输速率的特点&#xff0c;适用于多种无线通信场景。 在电赛中&…

百日筑基第二十八天-23种设计模式-行为型总汇

百日筑基第二十八天-23种设计模式-行为型总汇 文章目录 百日筑基第二十八天-23种设计模式-行为型总汇前言模板方法模式简介模板方式的特点模板方法模式结构类图模板方式模式案例分析模板方法模式应用源码分析模板方法模式的注意事项和细节 迭代器模式迭代器模式结构类图迭代器模…

googleTest 源码主线框架性分析

本文备忘一个主题的分析过程和结论&#xff0c;即&#xff0c;googleTest框架中是如何调用相关的测试宏的&#xff1f; TEST TEST_F TEST_P 等等 1&#xff0c;googleTest 环境与简单示例 1.1 下载 googletest 并编译 下载&#xff1a; $ git clone https://github.com/goog…

5 C 语言数组与字符串的全面解析

目录 1 数组的概念与特性 1.1 什么是数组 1.2 数组的特点 1.3 数组的用途 2 一维数组的定义与初始化 2.1 一维数组的定义 2.2 声明与定义的区别 2.3 一维数组的多种初始化 3 数组名的命名规则与作用 3.1 数组名的命名规则 3.2 数组名的作用 4 一维数组在内存中的存…

实战篇(十二):如何使用 Processing 创建一个多功能的简易吃豆人游戏

如何使用 Processing 创建一个多功能的简易吃豆人游戏 文章目录 如何使用 Processing 创建一个多功能的==简易==吃豆人游戏引言准备工作第一步:设置基本框架第二步:创建 Pacman 类第三步:创建 Obstacle 类第四步:添加分数系统第五步:运行游戏完整代码结论参考资料引言 吃…