首页 > 编程语言 >java中的注解使用

java中的注解使用

时间:2024-12-09 12:32:30浏览次数:2  
标签:lang joinPoint java org 使用 import 注解 annotation

说明

java中的注解(Annotation)是用于为代码添加元数据的信息,编译器可以通过注解进行不同的处理。注解本身并不直接影响程序的运行。

常见内置注解

@Override 标记重写父类方法
@Deprecated
标记类、方法、字段等不推荐使用,可能会在未来的版本中删除。
@SuppressWarnings
抑制编译器的警告。

自定义注解使用

使用@interface来定义,方法可以有默认值,注解并不直接影响代码的语义。

元注解

Java提供了几个元注解(用于注解其他注解),包括@Target、@Retention、@Documented、@Inherited。
@Target: 指定注解的适用范围(类、方法、字段等)。
@Retention: 指定注解的保留策略(源代码、编译期或运行时)。
@Documented: 表明注解应该包含在JavaDoc中。
@Inherited: 表示注解可以被子类继承。

package com.example.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogMask {
    String active();

    String value() default "***";
}

新增aop依赖包

compileOnly("org.springframework.boot:spring-boot-starter-aop:2.6.13")

新增aspect配置类

package com.example.config;

import com.example.annotation.LogMask;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class LogAspect {


    @Before(value = "@annotation(logMask)", argNames = "joinPoint,logMask")
    public void logBefore(final JoinPoint joinPoint, final LogMask logMask) {
        log.info("action:[{}]", logMask.action());
        System.out.println("Method " + joinPoint.getSignature().getName() + " is starting...");

    }

    // 在方法执行后执行
    @After(value = "@annotation(com.example.annotation.LogMask)")
    public void logAfter(final JoinPoint joinPoint) {
        System.out.println("Method " + joinPoint.getSignature().getName() + " has finished.");
    }

    // 环绕通知(可以在方法执行前后做更多操作,返回值可以控制方法是否执行)
    @Around(value = "@annotation(logMask)", argNames = "joinPoint,logMask")
    public Object logAround(final ProceedingJoinPoint joinPoint, LogMask logMask) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed();  // 执行目标方法
        long endTime = System.currentTimeMillis();
        System.out.println("Method " + joinPoint.getSignature().getName() + " executed in " + (endTime - startTime) + " ms");
        return result;
    }

}

在方法上添加自定义注解

package com.example.service;


import com.example.annotation.LogMask;
import org.springframework.stereotype.Service;

@Service
public class LoginService {

    @LogMask(action = "login")
    public String login(String username, String password) {
        System.out.println("username login success:" + username);
        return "success";
    }
}

JoinPoint 和 ProceedingJoinPoint的区别

JoinPoint

  1. 用在 @Before 和 @After 通知上
  2. 只能获取方法信息。
  3. 不能控制目标方法的执行(不能调用 proceed())。
  4. 适用于 @Before、@After 等不需要改变方法行为的通知,即不能改变方法的参数值那些,方法的执行过程不受改变

ProceedingJoinPoint

  1. ProceedingJoinPoint 是 JoinPoint 的子接口
  2. 主要用于 @Around 通知中。它除了拥有 JoinPoint 的功能外
  3. 提供了 proceed() 方法,允许在通知中控制目标方法的执行

标签:lang,joinPoint,java,org,使用,import,注解,annotation
From: https://www.cnblogs.com/chengdanally/p/18582987

相关文章

  • VLM-OCR-Demo:一个使用VLM用于OCR任务的示例
    https://www.cnblogs.com/mingupupu/p/18594592 前言上一篇文章TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面中我们构建了一个方便使用TesseractOCR的用户界面,今天构建一个类似的界面,使用SemanticKernel接入视觉模型,测试一下用视觉模型做OCR任务的效果。在......
  • Java Playwright 浏览器最大化
    Playwright是一个用于自动化Web应用测试的现代工具,支持多种语言(包括Java)及多个浏览器(如Chromium、Firefox和WebKit)。它提供了一致的API来控制浏览器行为,其中包括窗口操作,如最大化。本文将详细介绍如何在JavaPlaywright中实现浏览器窗口的最大化,并提供详细的代码示例。......
  • java review
    一、多态向上转型FUfu=newZi();可以调用子类方法,不能调用子类特有方法(成员方法)成员变量,看等号左边的是谁,调用谁里面的成员变量二、内部类1.什么时候使用内部类:​ 当一个事务的内部,还有一个部分需要定义完整的结构去描述,而这个内部的完整结构又只为外部事物提供......
  • VLM-OCR-Demo:一个使用VLM用于OCR任务的示例
    前言上一篇文章TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面中我们构建了一个方便使用TesseractOCR的用户界面,今天构建一个类似的界面,使用SemanticKernel接入视觉模型,测试一下用视觉模型做OCR任务的效果。在之前的文章使用Tesseract进行图片文字识别的总结中......
  • java基础--多线程
    进程与线程进程(Process):每个独立运行的程序都对应一个进程。进程是资源分配的最小单位,占用独立的内存空间和系统资源线程(Thread):CPU调度和分派的基本单位,程序执行过程中的最小单元例如:迅雷是个进程,里面的多个下载任务属于线程二者区别进程是资源分配的基本单位,线程......
  • 如何处理 JavaScript 中的事件委托?
    目录事件委托简介为什么要使用事件委托事件委托的原理事件委托的实际应用4.1示例1:动态生成的列表项点击事件4.2示例2:表单验证事件委托的优缺点常见问题及优化1.事件委托简介事件委托是指将一个事件处理程序绑定到父元素上,而不是直接绑定到每个子元素上。通过事件......
  • 基于java ssm篮球网上商城系统(源码+文档+运行视频+讲解视频)
     文章目录系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈后端框架SSM前端框架vueSSM框架详细介绍系统测试四、代码参考源码获取目的摘要: 本文论述基于JavaSSM框架构建的篮球网上商城系统。该系统在满足篮球爱好者购物需求和推动篮球运动发......
  • 基于java ssm家用电器上门回收系统回收分配订单(源码+文档+运行视频+讲解视频)
     文章目录系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈后端框架SSM前端框架vueSSM框架详细介绍系统测试四、代码参考源码获取目的摘要: 本文论述基于JavaSSM框架构建的家用电器上门回收系统。该系统在推动资源循环利用和环保事业中发挥着......
  • 基于java ssm教师教学数据统计分析系统论文课题科研成果工作量考核工作日志(源码+文档+
     文章目录系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈后端框架SSM前端框架vueSSM框架详细介绍系统测试四、代码参考源码获取目的摘要: 本文论述基于JavaSSM框架构建的教师教学数据统计分析系统。该系统对提升教学管理水平和教师教学质量......
  • 基于java ssm考研租房网站系统房屋租赁租房合同(源码+文档+运行视频+讲解视频)
     文章目录系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈后端框架SSM前端框架vueSSM框架详细介绍系统测试四、代码参考源码获取目的摘要: 本文介绍基于JavaSSM框架构建的考研租房网站系统。该系统在满足考研学生租房需求方面具有重要意义。......