Spring AOP用法(待完善)

news/2025/1/24 17:58:56/

Cglib实现AOP

    // 切所有方法@Testpublic void cglib1() {UserService target = new UserService();// 通过cglib实现AOPEnhancer enhancer = new Enhancer();enhancer.setSuperclass(UserService.class);// 定义额外逻辑,也就是代理逻辑// o:代理对象;     method:被代理类方法;  objects:方法参数;   methodProxy:代理类方法enhancer.setCallbacks(new Callback[]{(MethodInterceptor) (o, method, objects, methodProxy) -> {System.out.println("before...");Object result = methodProxy.invoke(target, objects);System.out.println("after...");return result;}});// 动态代理所创建出来的UserService代理对象UserService userService = (UserService) enhancer.create();// 执行这个userService的test方法时,就会额外会执行一些其他逻辑userService.test();}// 切指定方法@Testpublic void cglib2() {UserService target = new UserService();// 通过cglib实现AOPEnhancer enhancer = new Enhancer();enhancer.setSuperclass(UserService.class);// 定义多个代理逻辑, 数组类型enhancer.setCallbacks(new Callback[]{(MethodInterceptor) (o, method, objects, methodProxy) -> {System.out.println("before...");Object result = methodProxy.invoke(target, objects);System.out.println("after...");return result;}, NoOp.INSTANCE});// 设置切面匹配逻辑, return对应执行的callback数组enhancer.setCallbackFilter(method -> {if("test".equals(method.getName())) {return 0;}return 1;});// 动态代理所创建出来的UserService代理对象UserService userService = (UserService) enhancer.create();// 执行这个userService的test方法时,就会额外会执行一些其他逻辑userService.test();userService.print();}

下面执行结果, 可看出, 只有test执行了额外逻辑, print执行了空代理逻辑

before...
test---------
after...
print---------

JDK动态代理实现AOP

    @Testpublic void jdkProxy1() {UserService target = new UserService();Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{UserInterface.class}, (proxy1, method, args) -> {System.out.println("before...");Object result = method.invoke(target, args);System.out.println("after...");return result;});UserInterface userInterface = (UserInterface) proxy;userInterface.test();}

ProxyFactory实现AOP

spring对cglib和jdk动态代理进行了封装, 叫做ProxyFactory代理工厂, 会自动根据是否是接口, 去切换.如果实现了接口, 用jdk动态代理, 否则用cglib动态代理.

// 代理类 - cglib动态代理@Testpublic void proxyFactory1() {UserService target = new UserService();ProxyFactory proxyFactory = new ProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAdvice(new MethodInterceptor() {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("before...");Object proceed = invocation.proceed();System.out.println("after...");return proceed;}});UserService userService = (UserService) proxyFactory.getProxy();userService.test();}// 代理接口 - jdk动态代理@Testpublic void proxyFactory2() {UserService target = new UserService();ProxyFactory proxyFactory = new ProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAdvice(new MethodInterceptor() {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("before...");Object proceed = invocation.proceed();System.out.println("after...");return proceed;}});UserInterface userService = (UserInterface) proxyFactory.getProxy();userService.test();}

Spring实现AOP

AOP概念

Aspect

Join point

Adivce

PointCut

Weaving


http://www.ppmy.cn/news/1231798.html

相关文章

hadoop、hive、DBeaver的环境搭建及使用

本文主要介绍hadoop、hive的结构及使用,具体的操作步骤见最后的附件; hadoop提供大数据的存储、资源调度、计算,分为三个模块:HDFS、YRAN、MapReduce HDFS提供数据的分布式存储,分为三个节点NameNode,DataNode,Second…

嵌入式开发、C++后台开发、C++音视频开发怎么选择?

嵌入式开发、C后台开发、C音视频开发怎么选择? 在日常生活中,视频类应用占据了我们越来越多的时间,各大公司也纷纷杀入这个战场,不管是抖音、快手等短视频类型,虎牙、斗鱼等直播类型,腾讯视频、爱奇艺、优酷…

手写vue响应式

let data { //相当于vue中的datamsg: "",name: ,age: 222,adress: {country: China,province: Beijing}}let vm {} //相当于vue实例function observe(target) {if (typeof target ! object || target null) { return target }Object.keys(target).forEach(key &…

[hive] posexplode函数

在Hive SQL中,posexplode是一个用于将数组(array)拆分为多行的函数。 它返回数组中的每个元素以及其在数组中的位置(索引)作为两列输出。 这是posexplode函数的语法: posexplode(array)其中,…

本机idea连接虚拟机中的Hbase

相关环境: 虚拟机:Centos7 hadoop版本:3.1.3 hbase版本:2.4.11 zookeeper版本:3.5.7 Java IDE:IDEA JDK:8 步骤 步骤一:在idea创建一个maven项目 步骤二:在虚拟机里找到core-site.x…

C++:哈希表的模拟实现

文章目录 哈希哈希冲突哈希函数 解决哈希冲突闭散列:开散列 哈希 在顺序结构和平衡树中,元素的Key和存储位置之间没有必然的联系,在进行查找的时候,要不断的进行比较,时间复杂度是O(N)或O(logN) 而有没有这样一种方案…

【Qt开发流程】之程序主窗口

描述 就目前的应用程序而言,一般包含菜单栏、工具栏、状态栏、中央区域等。 qt窗口部件类图如下: 一个主窗口提供了一个构建应用程序用户界面的框架。 Qt有QMainWindow及其相关类来管理主窗口。 QMainWindow有自己的布局,可以向其中添加QTo…

HCIP-二、MSTP+Eth-trunk

二、MSTPEth-trunk 实验拓扑实验需求及解法 实验拓扑 实验需求及解法 //1.如图所示,配置设备名称和 IP 地址。 //2.在 SW1 与 SW2 之间配置链路聚合协议 LACP,完成以下需求: //2.1 SW1 作为主动端,设置系统优先级为最高。 [SW1]l…