Spring实现自定义注解

news2024/9/22 9:35:19

一, 背景

目前部门有一个培训,需要讲一下Spring的使用,看到有同学提出问题,想自定义实现一个打日志的注解,下面就记录一下实现过程。

环境:

Spring 6.1.5,  不使用Spring Boot.

二,实现步骤

1, 引入Spring和Spring AOP相关依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>

2,在springmvc-servlet.xml里添加配置(这里的springmvc-servlet.xml是在web.xml中指定的servlet标签里名称决定的)。

<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

3,新建一个注解

import java.lang.annotation.*;


@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyLog {
}

4,新增一个切面

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyLogAspect {
    @Pointcut("@annotation(com.xxx.xxx.config.MyLog)")
    public void dsPointCut() {
    }

    @Before("dsPointCut()")
    public void doBefore() throws Throwable {
        System.out.println("我从before到注解的切点了");

    }

    @After("dsPointCut()")
    public void doAfter() {
        System.out.println("我从after退出了");
    }

    @Around("dsPointCut()")
    public Object doAround(ProceedingJoinPoint point) throws Throwable {
        System.out.println("我从around到注解的切点了");
        Object result = point.proceed();
        System.out.println("我从around退出了");
        return result;
    }
}

这里需要注意一点: point.proceed();表示程序继续运行, 然后拿到Object result, 一定要返回,不然被切面命中的方法会没有返回值, 也就是around这个处理要有返回值(因为它这个方法是自己定义,可以设置成void)。

5, 使用注解

import com.xxx.xxx.config.MyLog;
import com.xxx.xxx.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(value="/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping(value="/list", method= RequestMethod.GET)
    @MyLog
    public String getUser(@RequestParam(value="name")  String name) {
        System.out.println(userService.getName());

        List<String> nameList = userService.getUserNames();
        nameList.stream().forEach(a -> System.out.println(a));
        return "hahaha";
    }


}

6, 运行项目,调用接口,可以看到打印出想要的日志

三,总结

具体原理网络上一大堆,但是没有看到有人用Spring去实现,其他人实现的基本上都是用了SpringBoot,没有参考意义。

希望对你有帮助!

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

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

相关文章

Mysql--权限与安全管理

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、权限表 MySQL服务器通过权限表来控制用户对数据库的访问&#xff0c;权限表存放在MySQL数据库中&#xff0c;由MySQL_install_db脚本初始化。存储…

【工具篇】华为VRP通用操作系统 —— 配置文件管理

文章目录 配置文件分类配置文件命令配置文件工作原理 配置文件分类 设备的配置文件通常有两种类型&#xff1a; 1、启动配置文件&#xff08;Startup Configuration&#xff09;&#xff1a; 这是设备启动时加载的配置文件&#xff0c;包含了设备的基本配置信息&#xff0c;如…

Linux 内核源码分析---资源分配及系统总线

资源管理 Linux提供通用的构架&#xff0c;用于在内存中构建数据结构。这些结构描述了系统中可用的资源&#xff0c;使得内核代码能够管理和分配资源。 其中关键的数据结构resource如下&#xff1a; 用于连接parent, child, sibling成员规则如下&#xff1a; 1、每个子结点只…

接口测试学习笔记1

一、行业背景和测试分层 1、招聘需求 1&#xff09;手工测试&#xff1a;业务需求、业务逻辑 2&#xff09;自动化测试&#xff1a;业务逻辑 技术规范 功能自动化 QTP、Selenium 性能自动化 LoadRunner、JMeter 接口自动化 Postman、Fiddler、JMeter、SoapUI... …

值得一读!六本网络安全学习必备书籍推荐

在网络安全领域不断发展的今天&#xff0c;深入学习和掌握相关知识显得尤为重要。以下为大家推荐六本有助于提升网络安全技能的经典书籍。 一、《白帽子讲 Web 安全》 这本书由吴翰清撰写&#xff0c;涵盖了 Web 安全的诸多方面&#xff0c;包括常见的攻击手段、防御方法以及安…

XML 学习笔记

简介&#xff1a; &#xff08;1&#xff09;XML&#xff1a;可扩展性标记语言&#xff0c;用于传输和存储数据&#xff0c;而不是展示数据&#xff0c;是W3C 推举的数据传输格式。 XML的标签必须自定义&#xff0c;但是在写标签名的时候一定要有含义。 XML 只能有一个根节点…

微积分-微分应用7(优化问题)

解决优化问题的步骤&#xff1a; 理解问题 首先要仔细阅读问题&#xff0c;直到完全理解。问问自己&#xff1a;未知数是什么&#xff1f;已知量是什么&#xff1f;给定的条件是什么&#xff1f; 画图 在大多数问题中&#xff0c;画图并在图中标出给定和所需的量是有用的。 引…

用闲置的阿里云服务器使用 NPS 实现内网穿透

最近有个项目需要给外地的同事预览一下&#xff0c;但是公司没有可以公网访问的测试服务器&#xff0c;所以想到用内网穿透的方式让外地同事可以访问到我的本机。刚好我有一台阿里云的服务器&#xff0c;双十一打折买了3年&#xff0c;1000左右&#xff0c;2核8G&#xff0c;买…

24年税务师考试补报名即将开始啦

⏰税务师补报名重要时间节点 1⃣️补报名时间&#xff1a;8月6日10:00至8月16日17:00 2⃣️补报名缴费时间&#xff1a;8月6日10:00至8月18日24&#xff1a;00 3️⃣准考证打印时间&#xff1a;10月28日10:00至11月3日15:00 4⃣️考试时间&#xff1a;11月2日、3日 ✅税务…

c#中的BitConverter的java实现

最近在做c#项目的java迁移&#xff0c;发现部分C#方法java中没有对应实现如图&#xff1a; 且java中的数字类型都是有符号的所以转无符号的时候需要进行手动对符号位& 0xFFFF进行处理&#xff0c;目前只整理了项目中使用到的方法&#xff0c;后续有用到其他方法在进行追加如…

HarmonyOS 与 OpenHarmony 的区别详解

随着科技的不断进步&#xff0c;操作系统在我们日常生活中的重要性日益凸显。华为推出的 HarmonyOS 和 OpenHarmony 正是当前备受关注的两大操作系统。它们虽然紧密相关&#xff0c;但在理念、目标和应用场景上有显著的区别。本文将详细探讨这两者的不同之处。 一、概念解析 …

C++复习的长文指南(二)

C复习的长文指南&#xff08;二&#xff09; 一、面向对象基础知识5. 文件操作5.1文本文件5.1.1写文件5.1.2读文件 5.2 二进制文件5.2.1 二进制文件5.2.2 二进制读文件 6. c面向对象的个人心得开发流程6.16.26.36.46.5注意细节6.16.26.3 二、泛型编程1. 模板1.1 模板的概念1.2 …

GRFB UNet——基于多尺度注意网络盲道检测算法实现与模型C++部署

1. 概述 盲道是视障人士安全出行的重要辅助设施。识别盲道的形状和位置&#xff0c;对于增强视障人士的自主移动能力至关重要&#xff0c;而视觉分割技术正是应对这一挑战的有效工具。为了显著提升盲道分割的精确度和稳定性&#xff0c;本文提出了一种创新的分割方法&#xff…

OpenShift 4 - 用 oc-mirror 为离线 OpenShift 集群的 Mirror Registry 同步容器镜像

《OpenShift / RHEL / DevSecOps 汇总目录》 本文适合 OpenShift 4.11 及其以上版本。 文章目录 在离线环境中用 OpenShift 准备 Mirror Registry环境说明向隔离环境复制镜像准备节点环境bastion 节点操作support 节点操作 网络完全隔离环境-复制镜像bastion 节点操作support …

[图解]掉杠·above...duty -《分析模式》漫谈20

1 00:00:01,650 --> 00:00:05,120 今天我们来说一下《分析模式》和掉杠 1 00:00:00,480 --> 00:00:02,800 还是前言这里&#xff0c;有一句话 2 00:00:02,810 --> 00:00:04,850 I will mention 3 00:00:04,860 --> 00:00:05,250 that 4 00:00:05,680 --> 00…

【Golang 面试 - 进阶题】每日 3 题(十四)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

实战:MySQL数据同步神器之Canal

1.概叙 场景一&#xff1a;数据增量实时同步 项目中业务数据量比较大&#xff0c;每类业务表都达到千万级别&#xff0c;虽然做了分库分表&#xff0c;每张表数据控制在300W以下&#xff0c;但是效率还是达不到要求&#xff0c;为了提高查询效率&#xff0c;打算使用ES进行数…

Java面试题--JVM大厂篇之破解Java性能瓶颈!深入理解Parallel GC并优化你的应用

目录 引言&#xff1a; 正文&#xff1a; 1. 理解Parallel GC的工作原理 2. 配置Parallel GC 3. 监控和分析GC日志 4. 常见调优技巧 5. 持续迭代和优化 结束语&#xff1a; 补充考虑 1. 综合考虑吞吐量与响应时间 2. 评估和优化垃圾回收频率 3. 动态调整与自适应策…

定期自动巡检,及时发现机房运维管理中的潜在问题

随着信息化技术的迅猛发展&#xff0c;机房作为企业数据处理与存储的核心场所&#xff0c;其运维管理的复杂性和挑战性也与日俱增。为确保机房设备的稳定运行和业务的连续性&#xff0c;运维团队必须定期进行全面的巡检。然而&#xff0c;传统的手工巡检方式不仅效率低下&#…

【卷积神经网络】基于CIFAR10数据集实现图像分类【构建、训练、预测】

文章目录 1、内容简介2、CIFAR10 数据集2.1、数据集概述2.2、代码使用2.2.1、查看数据集基本信息2.2.2、数据加载器2.2.3、完整代码 3、搭建图像分类网络&#x1f53a;3.1、网络结构⭐3.2、代码构建网络⭐ 4、编写训练函数4.1、多分类交叉熵损失函数&#x1f53a;4.2、Adam&…