java SpringAop 自定义注解 解析

简介: java SpringAop 自定义注解 解析

1、依赖引入

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2、新建自定义注解

package com.annotation.annotation;
import com.annotation.constant.MessageType;
import java.lang.annotation.*;
/**
 * @author wuzhenyong
 * ClassName:Message.java
 * date:2022-05-23 14:06
 * Description:
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Message {
    /**
     * 消息内容
     */
    public String content() default "";
    /**
     * 发送人
     */
    public String sendUser() default "admin";
    /**
     * 接收人
     */
    public String recvUser() default "admin";
    /**
     * 自定义消息类型
     */
    public MessageType messageType() default MessageType.DEFAULT;
}

3、新建消息类型枚举

package com.annotation.constant;
/**
 * @author wuzhenyong
 * ClassName:MessageType.java
 * date:2022-05-23 14:09
 * Description:
 */
public enum MessageType {
    /**
     * 消息类型
     */
    DEFAULT,
    ONE,
    TWO,
    THREE,
}

4、新建aop切面类解析

package com.annotation.aop;
import com.annotation.annotation.Message;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
 * @author wuzhenyong
 * ClassName:MessageAspect.java
 * date:2022-05-23 14:05
 * Description:
 */
@Aspect
@Component
public class MessageAspect {
  /**
     * @annotation(注解类所在路径)
     */
    @Pointcut("@annotation(com.annotation.annotation.Message)")
    public void sendMessagePointCut() {
    }
    /**
     * 获取方法上注解
     */
    @Before("sendMessagePointCut()")
    public void sendMessageBefor(JoinPoint joinPoint) {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        // 获取注解参数
        Message annotation = method.getAnnotation(Message.class);
        System.out.println("before message :");
        System.out.println(annotation);
    }
    @After("sendMessagePointCut()")
    public void sendMessageAfter(JoinPoint joinPoint) {
    }
}

5、新建controller

package com.annotation.controller;
import com.annotation.annotation.Message;
import com.annotation.constant.MessageType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author wuzhenyong
 * ClassName:MessageController.java
 * date:2022-05-23 14:24
 * Description:
 */
@RestController
@RequestMapping("/message")
public class MessageController {
    @GetMapping("/sendMessage")
    @Message(content = "发送信息", recvUser = "send1", messageType = MessageType.ONE)
    public String sendMessage() {
        return "发送成功";
    }
}

6、测试方法


264174375d4144c1a5bcf175925fa06a[0].png

相关文章
|
6月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
243 4
|
6月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
6月前
|
存储 安全 Java
《数据之美》:Java集合框架全景解析
Java集合框架是数据管理的核心工具,涵盖List、Set、Map等体系,提供丰富接口与实现类,支持高效的数据操作与算法处理。
|
7月前
|
Java 开发者
Java 函数式编程全解析:静态方法引用、实例方法引用、特定类型方法引用与构造器引用实战教程
本文介绍Java 8函数式编程中的四种方法引用:静态、实例、特定类型及构造器引用,通过简洁示例演示其用法,帮助开发者提升代码可读性与简洁性。
|
7月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
560 100
|
7月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
1633 0
|
7月前
|
安全 Java API
Java SE 与 Java EE 区别解析及应用场景对比
在Java编程世界中,Java SE(Java Standard Edition)和Java EE(Java Enterprise Edition)是两个重要的平台版本,它们各自有着独特的定位和应用场景。理解它们之间的差异,对于开发者选择合适的技术栈进行项目开发至关重要。
1157 1
|
7月前
|
Java
Java的CAS机制深度解析
CAS(Compare-And-Swap)是并发编程中的原子操作,用于实现多线程环境下的无锁数据同步。它通过比较内存值与预期值,决定是否更新值,从而避免锁的使用。CAS广泛应用于Java的原子类和并发包中,如AtomicInteger和ConcurrentHashMap,提升了并发性能。尽管CAS具有高性能、无死锁等优点,但也存在ABA问题、循环开销大及仅支持单变量原子操作等缺点。合理使用CAS,结合实际场景选择同步机制,能有效提升程序性能。
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
295 1
|
6月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
315 1

推荐镜像

更多
  • DNS