Aop天花板

拒绝废话,拒绝冗余文字,直接上代码和案例
1 导入依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2 通知类配置解释(各个配置含义在代码中解释):
package com.nanfeng.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import java.util.Arrays;@Aspect
@Component
public class AopAdvice {private final static Logger logger = LoggerFactory.getLogger(AopAdvice.class);/*注意:  PointCut中可以使用 && 、|| 、! 运算*//*** 自定义注解 :凡是被注解标注的方法和类都会处罚aop*/@Pointcut("@annotation(com.nanfeng.aop.AopTag)")public void annotation() {}/*** 表达式:访问修饰符 返回值 包名.包名.包名…类名.方法名(参数列表)* 标准写法 :public void com.nanfeng.aop.service.AopService.executionAop()* 省略修饰符号:void com.nanfeng.aop.service.AopService.executionAop()* 返回值使用通配符: * com.nanfeng.aop.service.AopService.executionAop()* 通配符标表示:  *.*.*.AopService.*()* 多包名匹配:  *.*.*.AopService.*()* 参数类型匹配(根据类型匹配):  *.*.*.AopService.*(int,double)* 参数通配:  *.*.*.AopService.*(..)*/@Pointcut("execution(* com.nanfeng.aop.service.AopService.aopExecution(..))")public void execution1() {}/*** 指定类型中的所有方法将被拦截* 不包含子类,只是针对当前对象* 包名通配方式 ..* 类名通配方式**/@Pointcut("within(com.nanfeng.aop.service.WithService)")public void with() {}/**** 类型匹配,包含子类中的所有方法(子类中扩展的方法也包含在其中)*/@Pointcut("this(com.nanfeng.aop.service.ThisService)")public void thisService() {}/**** 类型匹配,包含子类中的所有方法(子类中扩展的方法也包含在其中)*/@Pointcut("target(com.nanfeng.aop.service.TargetService)")public void targetService() {}/*** args() 匹配不带参数的方法* args(java.lang.String) 匹配方法参数是String类型的* ==args(…) == 带任意参数的方法* args(java.lang.String,…) 匹配第一个参数是String类型的,其他参数任意。最后一个参数是String的同理。*/@Pointcut("args(..)")public void argsService() {}/*** 匹配方法带有参数com.nanfeng.aop.AopTag注解的方法*/@Pointcut("@args(com.nanfeng.aop.AopTag)")public void argAnnotationsService() {}/*** 匹配bean为beanService的所有方法*/@Pointcut("bean(beanService)")public void beanService() {}@Around("annotation()")public Object annotationAdvice(ProceedingJoinPoint pjp) throws Throwable {Object[] args = pjp.getArgs();Object result = pjp.proceed(args);System.out.println("annotation");return result;}@Around("execution1()")public Object executionAdvice1(ProceedingJoinPoint pjp) {Object[] args = pjp.getArgs();System.out.println(Arrays.toString(args));System.out.println("execution");Object result = null;try {result = pjp.proceed(args);} catch (Throwable e) {throw new RuntimeException(e);}return result;}@Around("with()")public Object withAdvice(ProceedingJoinPoint pjp) {Object[] args = pjp.getArgs();System.out.println(Arrays.toString(args));System.out.println("with");Object result = null;try {result = pjp.proceed(args);} catch (Throwable e) {throw new RuntimeException(e);}return result;}@Around("thisService()")public Object thisAdvice(ProceedingJoinPoint pjp) throws Throwable {//获取方法的信息MethodSignature methodSignature = (MethodSignature) pjp.getSignature();String name = methodSignature.getMethod().getName();logger.info("thisService");//然后做一些重大操作   todo :System.out.println("method name is " + name);Object[] args = pjp.getArgs();System.out.println(Arrays.toString(args));Object result = pjp.proceed(args);return result;}@Around("targetService()")public Object targetAdvice(ProceedingJoinPoint pjp) throws Throwable {//获取方法的信息MethodSignature methodSignature = (MethodSignature) pjp.getSignature();String name = methodSignature.getMethod().getName();logger.info(" targetService");//然后做一些重大操作   todo...................System.out.println("method name is " + name);Object[] args = pjp.getArgs();System.out.println(Arrays.toString(args));Object result = pjp.proceed(args);return result;}@Around("beanService())")public Object beanAdvice(ProceedingJoinPoint pjp) throws Throwable {//获取方法的信息MethodSignature methodSignature = (MethodSignature) pjp.getSignature();String name = methodSignature.getMethod().getName();logger.info("beanService");//然后做一些重大操作   todo...................System.out.println("method name is " + name);Object[] args = pjp.getArgs();System.out.println(Arrays.toString(args));Object result = pjp.proceed(args);return result;}
}

3 配合通知类的service以及注解:

package com.nanfeng.aop;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface AopTag {String value() default "";
}
package com.nanfeng.aop.service;import com.alibaba.fastjson.JSONObject;
import com.nanfeng.aop.AopTag;
import org.springframework.stereotype.Service;@Service
public class AopService {public Object aopExecution(Object o) {return JSONObject.toJSONString(o);}@AopTag(value = "cccc")public Object annotation1(Object o) {return JSONObject.toJSONString(o);}
}
package com.nanfeng.aop.service;import org.springframework.stereotype.Component;@Component
public class BeanService {public void bean1() {System.out.println("bean");}public void bean2() {System.out.println("bean");}
}
package com.nanfeng.aop.service;public interface TargetService {
public Object target1(Object o);
}
package com.nanfeng.aop.service;import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Service;@Service
public class TargetServiceImp1  implements TargetService{@Overridepublic Object target1(Object o) {return JSONObject.toJSONString(o);}
}
package com.nanfeng.aop.service;import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Service;@Service
public class TargetServiceImp2 implements TargetService {@Overridepublic Object target1(Object o) {return JSONObject.toJSONString(o);}public Object target22(Object o) {return JSONObject.toJSONString(o);}
}
package com.nanfeng.aop.service;public interface ThisService {public String AopThis();
}
package com.nanfeng.aop.service;import org.springframework.stereotype.Component;@Component
public class ThisServiceImp  implements ThisService{@Overridepublic String AopThis() {return "this aop service";}
}
package com.nanfeng.aop.service;import org.springframework.stereotype.Component;@Component
public class ThisServiceImp1  implements ThisService{@Overridepublic String AopThis() {return "this aop service1";}public String AopThis1() {return "this aop service2";}
}
package com.nanfeng.aop.service;import org.springframework.stereotype.Service;@Service
public class WithService {public String aopwith() {return "31213";}
}
3 测试接口
package com.nanfeng.aop;import com.nanfeng.aop.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AopController {@Autowiredprivate AopService service;@Autowiredprivate WithService withService;@Autowiredprivate ThisServiceImp thisService;@Autowiredprivate ThisServiceImp1 thisService1;@Autowiredprivate TargetServiceImp1 target1;@Autowiredprivate TargetServiceImp2 target2;@Autowiredprivate BeanService beanService;@PostMapping("execution")public Object execution(@RequestBody Object o) {return service.aopExecution(o);}@PostMapping("annotation")public Object annotation1(@RequestBody Object o) {return service.annotation1(o);}@PostMapping("with")public Object with(@RequestBody Object o) {return withService.aopwith();}@PostMapping("this")public Object thisaop(@RequestBody Object o) {return thisService.AopThis() + thisService1.AopThis() + thisService1.AopThis1();}@PostMapping("target")public Object targetaop(@RequestBody Object o) {return target1.target1(o).toString() + target2.target1(o).toString() + target2.target22(o).toString();}@PostMapping("bean")public Object beanaop(@RequestBody Object o) {beanService.bean1();beanService.bean2();return o ;}
}

基本覆盖所有的aop使用方式,复制哼一声

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

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

相关文章

算法进阶指南图论 通信线路

通信线路 思路&#xff1a;我们考虑需要升级的那条电缆的花费&#xff0c;若其花费为 w &#xff0c;那么从 1 到 n 的路径上&#xff0c;至多存在 k 条路径的价值大于 w &#xff0c;这具有一定的单调性&#xff0c;当花费 w 越大&#xff0c;我们路径上价值大于 w 的花费会越…

25期代码随想录算法训练营第十三天 | 栈与队列 part 2

目录 239. 滑动窗口最大值347.前 K 个高频元素方法一方法二 239. 滑动窗口最大值 链接 窗口 — 维持一个单调递增队列 为什么要使用队列&#xff1f; 在窗口移动的时候&#xff0c;方便把不属于窗口的最大值剔除。&#xff08;当窗口移动之后&#xff09; class Solution:…

React中JSX语法入门

JSX语法入门及代码 JSX是一种JavaScript的语法扩展&#xff0c;用于在React中描述用户界面的结构。它允许开发者使用类似HTML的语法来创建React元素&#xff0c;使得代码更具可读性和可维护性。JSX将HTML标签和JavaScript代码结合在一起&#xff0c;可以在其中使用JavaScript表…

【C++ Primer Plus学习记录】第4章编程练习

1.编写一个C程序&#xff0c;如下述输出示例所示的那样请求并显示信息&#xff1a; What is your first name? Betty Sue What is your last name? Yewe What letter grade do you deserve? B What is your age? 22 Name: Yewe,Betty Sue Grade: C Age: 22 注意&am…

读者自荐的 4 个 GitHub 项目

本期推荐的 4 个开源项目&#xff0c;为读者在开源项目 Awesome-GitHub-Repo 的评论区自推的, 如果你开源了不错的项目&#xff0c;想让大家看到&#xff0c;也可以去 Awesome-GitHub-Repo 进行投稿。 本期推荐开源项目目录&#xff1a; 1. DB-GPT 2. 定制中国传统节日头像 3. …

Linux 实用的监控机器操作指令

在 Linux 系统中&#xff0c;有许多监控指令可以用于实时或周期性地监视系统资源使用情况。以下是一些实用的 Linux 监控指令&#xff1a; 1. top top 命令可以实时显示系统运行的进程和相关性能统计信息。 top按 q 键退出。 2. htop htop 是 top 的交互式版本&#xff0c…

Java / Android 多线程和 synchroized 锁

s AsyncTask 在Android R中标注了废弃 synchronized 同步 Thread: thread.start() public synchronized void start() {/*** This method is not invoked for the main method thread or "system"* group threads created/set up by the VM. Any new functionali…

超全大厂UI库分享,可免费套用!

今天我们要给大家分享的是TDesign、Arco Design、Ant Design、Material design等6个优秀的大厂UI库&#xff0c;一次性打包送给大家&#xff0c;通通免费用。大厂UI库都是经过无数次的事件检验的&#xff0c;扛住了许多种使用场景和突发情况的组件资源库&#xff0c;是前人的经…

HarmonyOS NEXT 调优工具 Smart Perf Host 高效使用指南

在软件开发的过程中&#xff0c;很多开发者都经常会遇到一些性能问题&#xff0c;比如应用启动慢、点击滑动卡顿、应用后台被杀等&#xff0c;想要解决这些问题势必需要收集大量系统数据。而在收集数据的过程中&#xff0c;开发者则需要在各种工具和命令之间来回切换&#xff0…

k8s 部署mqtt —— 筑梦之路

mqtt是干嘛的&#xff0c;网上有很多资料&#xff0c;这里就不再赘述。 --- apiVersion: apps/v1 kind: Deployment metadata:labels:app: mqttname: mqttnamespace: default spec:replicas: 1selector:matchLabels:app: mqttstrategy:rollingUpdate:maxSurge: 25%maxUnavaila…

华为认证 | 11月底这门HCIP认证即将发布!

非常荣幸地通知您&#xff0c;华为认证HCIP-Storage V5.5&#xff08;中文版&#xff09;预计将于2023年11月30日正式对外发布。为了帮助您做好学习、培训和考试计划&#xff0c;现进行预发布通知&#xff0c;请您关注。 01 发布概述 基于“平台生态”战略&#xff0c;围绕“云…

Django快速入门(一)

Django三板斧 1. 基本使用 三板斧: HttpResponse,render,redirect from django.shortcuts import HttpResponse,render,redirect# 一. 返回字符串类型的数据 return HttpResponse(字符串) # 二. 返回HTML文件 # 1. 动态HTML页面: return render(request,login.html) def ab…

西门子S7-1200PLC混合通信编程(ModbusTcp和UDP通信)

S7-1200PLC的MODBUS-TCP通信 西门子PLC ModbusTcp通信访问网关后从站(SCL语言轮询状态机)-CSDN博客文章浏览阅读305次。西门子PLC的ModbusTcp通信在专栏已有很多文章介绍,所不同的是每个项目的通信需求都略有不同,今天我们以访问网关后的三个从站数据来举例,给出轮询的推荐…

iOS 16.4 之后真机与模拟器无法使用Safari调试H5页面问题

背景 iOS 16.4之后用真机调试H5时候发现&#xff0c;Safari中开发模块下面无法调试页面 解决方案 在WKWebView中设置以下代码解决 if (available(iOS 16.4, *)) {[_webView setInspectable:YES];}然后再次调试就可以了

SwissArmyTransformer瑞士军刀工具箱使用手册

Introduction sat&#xff08;SwissArmyTransformer&#xff09;是一个灵活而强大的库&#xff0c;用于开发您自己的Transformer变体。 sat是以“瑞士军刀”命名的&#xff0c;这意味着所有型号&#xff08;例如BERT、GPT、T5、GLM、CogView、ViT…&#xff09;共享相同的backo…

[git] cherry pick 将某个分支的某次提交应用到当前分支

功能&#xff1a;将某个分支的某次提交应用到当前分支 应用场景&#xff1a; 在合并分支时&#xff0c;是将源分支的所有内容都合并到目标分支上&#xff0c;有的时候我们可能只需要合并源分支的某次或某几次的提交&#xff0c;这个时候我们就需要使用到git的cherry-pick操作…

边缘计算多角色智能计量插座:用电监测和资产管理的未来智能化引擎

目前主流的智能插座涵盖了红外遥控&#xff08;控制空调和电视等带有红外标准的电器&#xff09;&#xff0c;配备着测温、测湿等仓库应用场景&#xff0c;配备了人体红外或者毫米波雷达作为联动控制&#xff0c;但是大家有没有思考一个问题&#xff0c;就是随着对接的深入&…

易点易动固定资产管理系统:实现全生命周期闭环式管理和快速盘点

固定资产管理对于企业来说至关重要&#xff0c;它涉及到资产的采购、领用、使用、维护和报废等各个环节。然而&#xff0c;传统的固定资产管理方式往往繁琐、耗时&#xff0c;容易导致信息不准确和资源浪费。为了解决这些问题&#xff0c;我们引入易点易动固定资产管理系统&…

PHP+Swoole应用示例

**Swoole是一个C编写的基于异步事件驱动和协程的并行网络通信引擎&#xff0c;为PHP提供高性能网络编程支持** ## ⚙️ 快速启动 可以直接使用 [Docker](https://github.com/swoole/docker-swoole) 来执行Swoole的代码&#xff0c;例如&#xff1a; bash docker run --rm php…

DevOps简介

DevOps简介 1、DevOps的起源2、什么是DevOps3、DevOps的发展现状4、DevOps与虚拟化、容器 1、DevOps的起源 上个世纪40年代&#xff0c;世界上第一台计算机诞生。计算机离不开程序&#xff08;Program&#xff09;驱动&#xff0c;而负责编写程序的人&#xff0c;被称为程序员&…