自定义注解

简介: asvasva

1.前言

自定义注解目前在我使用过的项目中,主要用用作日志丰富,参数处理,其核心还是借助于Spring的AOP进行实现,本文将结合具体代码演示简单的自定义注解实现流程。

2.实现

2.1 定义User

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String name;
}

2.2 定义UserDAO

@Component
public class UserDao {
    public User findUserById(Integer id) {
        if(id > 10) {
            return null;
        }
        return new User(id, "user-" + id);
    }
}

2.3 定义UserService

@Service
public class UserService {
    private final UserDao userDao;
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
    public User findUserById(Integer id) {
        return userDao.findUserById(id);
    }
}

2.4 定义Controller

@RequestMapping(value = "user/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public User findUser(@PathVariable("id") Integer id) {
    return userService.findUserById(id);
}

此时浏览器访问:http://{domain}/user/1即可出现对应效果

{
    "id": 1,
    "name": "user-1"
}

2.5 定义自定义注解

import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CustomAnnotation {
    String name() default "";
    String value() default "";
}

说明:

  • @interface 不是interface,是注解类  定义注解
  • Documented
  • 这个Annotation可以被写入javadoc  
  • @Retention
  • 修饰注解,是注解的注解,称为元注解
  • SOURCE,     // 编译器处理完Annotation后不存储在class中  
  • CLASS,       // 编译器把Annotation存储在class中,这是默认值  
  • RUNTIME  // 编译器把Annotation存储在class中,可以由虚拟机读取,反射需要
  • @Target
  • 注解的作用目标
  • @Target(ElementType.TYPE)                                           //接口、类、枚举、注解
  • @Target(ElementType.FIELD)                                         //字段、枚举的常量
  • @Target(ElementType.METHOD)                                   //方法
  • @Target(ElementType.PARAMETER)                              //方法参数
  • @Target(ElementType.CONSTRUCTOR)                        //构造函数
  • @Target(ElementType.LOCAL_VARIABLE)                     //局部变量
  • @Target(ElementType.ANNOTATION_TYPE)                //注解
  • @Target(ElementType.PACKAGE)                                 //包    


  • 可以定义多个方法,每个方法在使用时参照下面的Controller使用即可,实际就是类似于@PostMapping这样的注解中使用过的value,method,produces等,如下:

相关文章
|
5月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
Java泛型在编译时会进行类型擦除,泛型信息被移除,仅保留原始类型(如Object或限定类型)。例如,List<String>和List<Integer>在运行时都变为List,导致无法通过instanceof判断泛型类型。类型检查发生在编译期,针对引用而非对象本身。为实现多态,编译器生成桥方法解决擦除后的冲突。静态成员不能使用类的泛型参数,因泛型实例化依赖对象创建,而静态上下文无需实例。基本类型需用包装类替代,如Double而非double。
|
2月前
|
数据采集 人工智能 搜索推荐
GEO与SEO的核心差异:AI搜索时代企业应提前布局的下一代优化体系
GEO不是“AI版SEO”,而是AI搜索时代的新增长逻辑:SEO抢流量位置,GEO夺AI信任票。二者在优化对象、目标、竞争维度、技术逻辑和效果上根本不同——GEO聚焦被AI理解、采纳与引用,实现心智占领与权威确立。企业需SEO稳基础,GEO建未来。(239字)
908 3
|
26天前
|
人工智能 自然语言处理 安全
别再乱装了!OpenClaw 中文版一键部署,Windows 免配置直用(包含新安装包)
告别报错和复杂教程,这款 OpenClaw 汉化一键包自带完整运行环境,安装即汉化,无需手动修改任何文件,真正开箱即用。
|
1月前
|
人工智能 IDE 测试技术
Claude Code 编程哲学正在改变一切:从“理解代码”到“跑通代码”
本文剖析Coding Agent范式演进:传统“理解优先”向量方案在真实工程中失效,因代码动态性、理解≠修改、上下文增噪;Claude Code转向“终端调试范式”,以执行反馈驱动多轮试错;CodeGraph仅优化检索,未解修改正确性难题。核心转变是从“看懂代码”到“跑通代码”,标志AI编程进入执行驱动新阶段。
|
6月前
|
jenkins Java 应用服务中间件
Jenkins 、gitlab、实现CICD持续集成
本文介绍了GitLab与Jenkins的完整安装配置流程。涵盖环境依赖、RPM包安装、配置修改、服务启停及汉化、SSH密钥设置等内容,并详细说明Jenkins插件管理与初始密码获取,助力搭建高效DevOps平台。
229 0
|
2月前
|
IDE 编译器 开发工具
STM32CubeMX (FreeRTOS) 导入 VSCode EIDE 开发实战笔记
本文记录STM32F407ZET6平台下,用STM32CubeMX配置FreeRTOS并生成工程,再导入VSCode+EIDE插件开发的完整实践。重点解析链接脚本(.ld)四大语法错误——栈地址计算缺RAM参数、.data/.bss/堆栈段内存区域缺失等,并给出精准修复方案,助你快速打通VSCode嵌入式开发流程。(239字)
451 5
|
4月前
|
搜索推荐 数据可视化 安全
2026年外呼Agent产品推荐与选型指南
2026年,外呼系统迈向智能化升级,企业更关注业务闭环、客户体验与转化。瓴羊Quick Service依托通义大模型,实现营销、服务、运营一体化,支持情感识别、低代码配置与多系统集成,助力企业构建高效合规的智能外呼体系。
|
12月前
|
机器学习/深度学习 人工智能 安全
AI的万亿商机:红杉资本眼中的人工智能新时代
AI不仅仅是不可避免的趋势,而是已经到来的现实,其市场规模将远超过去的任何一次技术变革。这不是一场可以观望的比赛,而是一场必须全力以赴参与的革命。
520 22
|
传感器 安全 物联网
Gateway基本配置:打开网络之门
Gateway基本配置:打开网络之门
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
13093 4
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧