当前位置: 首页 > news >正文

Spring实现自定义注解

一, 背景

目前部门有一个培训,需要讲一下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 {@Autowiredprivate UserService userService;@RequestMapping(value="/list", method= RequestMethod.GET)@MyLogpublic 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,没有参考意义。

希望对你有帮助!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PHP开发【石头剪刀布小游戏】
  • 04-Fastjson反序列化漏洞
  • 麻雀搜索算法(SSA)与长短期记忆网络(LSTM)结合的预测模型(SSA-LSTM)的Python 和 MATLAB实现
  • 文档在线预览:keking/kkFileView踩坑记
  • 精通Perl代码优化:释放自定义优化技术的力量
  • 微软蓝屏事件:全球网络安全与系统稳定性的警示
  • Unity获取Animator动画播放完成事件
  • 第三十一天 chrome调试工具
  • 2023-2024年 Java开发岗面试题经验分享
  • ESP32是什么?
  • C++函数详解:全面指南
  • 什么是API 网关?为什么要 API网关?
  • AI应用开发前景与目标
  • vitis (eclipse) 的Indexer不能搜索、不能跳转到函数和变量定义和声明不能打开调用层次的解决方法
  • iOS ------RunLoop
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2017 年终总结 —— 在路上
  • android图片蒙层
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JAVA SE 6 GC调优笔记
  • Java应用性能调优
  • jdbc就是这么简单
  • js面向对象
  • oldjun 检测网站的经验
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • SpriteKit 技巧之添加背景图片
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 微服务框架lagom
  • 移动端解决方案学习记录
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • ​Java基础复习笔记 第16章:网络编程
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # Maven错误Error executing Maven
  • #HarmonyOS:基础语法
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (九)One-Wire总线-DS18B20
  • (排序详解之 堆排序)
  • (四) Graphivz 颜色选择
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • *2 echo、printf、mkdir命令的应用
  • .bashrc在哪里,alias妙用
  • .NET delegate 委托 、 Event 事件
  • .NET MVC第三章、三种传值方式
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET委托:一个关于C#的睡前故事
  • .NET项目中存在多个web.config文件时的加载顺序
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @component注解的分类