SSM9.1【Spring:面向切面编程AOP-Spring的AOP简介】
概述
JDK的动态代理
1 package com.haifei.proxy.jdk; 2 3 /** 4 * 目标类接口 5 */ 6 public interface TargetInterface { 7 8 public void save(); 9 10 }
1 package com.haifei.proxy.jdk; 2 3 /** 4 * 目标类 5 */ 6 public class Target implements TargetInterface{ 7 8 @Override 9 public void save() { 10 System.out.println("save running..."); 11 } 12 13 }
1 package com.haifei.proxy.jdk; 2 3 /** 4 * 增强类 5 */ 6 public class Advice { 7 8 public void before(){ 9 System.out.println("前置增强。。。"); 10 } 11 12 public void after(){ 13 System.out.println("后置增强。。。"); 14 } 15 16 }
1 package com.haifei.proxy.jdk; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 import java.lang.reflect.Proxy; 6 7 /** 8 * JDK 的动态代理-测试类 9 * 该类代码已被spring封装,实际应用过程中不用自己写,此处只为了解其原理 10 * 11 * 动态代理参考: 12 * JavaWeb19.6【Filter&Listener:利用设计模式之代理模式增强对象的功能】 13 * https://www.cnblogs.com/yppah/p/14974136.html 14 */ 15 public class ProxyTest { 16 17 public static void main(String[] args) { 18 //目标对象 19 final Target target = new Target(); 20 //增强对象 21 final Advice advice = new Advice(); 22 23 //获取动态生成的代理对象 24 TargetInterface proxy = (TargetInterface)Proxy.newProxyInstance( 25 target.getClass().getClassLoader(), //目标对象类加载器 26 target.getClass().getInterfaces(), //目标对象相同的接口字节码对象数组 27 new InvocationHandler() { 28 //调用代理对象的任何方法 实质执行的都是invoke方法 29 @Override 30 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 31 advice.before(); //前置增强 32 Object invoke = method.invoke(target, args); //执行目标方法 33 advice.after(); //后置增强 34 return invoke; 35 } 36 } 37 ); 38 39 //调用代理对象的方法 40 proxy.save(); 41 } 42 /* 43 前置增强。。。 44 save running... 45 后置增强。。。 46 */ 47 48 }
cglib动态代理
1 pom.xml 2 3 <dependency> 4 <groupId>org.springframework</groupId> 5 <artifactId>spring-context</artifactId> 6 <version>5.0.5.RELEASE</version> 7 </dependency>
1 package com.haifei.proxy.cglib; 2 3 /** 4 * 目标类 5 */ 6 public class Target{ 7 8 public void save() { 9 System.out.println("save running..."); 10 } 11 12 }
1 package com.haifei.proxy.cglib; 2 3 /** 4 * 增强类 5 */ 6 public class Advice { 7 8 public void before(){ 9 System.out.println("前置增强。。。"); 10 } 11 12 public void after(){ 13 System.out.println("后置增强。。。"); 14 } 15 16 }
1 package com.haifei.proxy.cglib; 2 3 import com.haifei.proxy.jdk.TargetInterface; 4 import org.springframework.cglib.proxy.Enhancer; 5 import org.springframework.cglib.proxy.MethodInterceptor; 6 import org.springframework.cglib.proxy.MethodProxy; 7 8 import java.lang.reflect.InvocationHandler; 9 import java.lang.reflect.Method; 10 import java.lang.reflect.Proxy; 11 12 /** 13 * cglib 的动态代理-测试类 14 * 该类代码已被spring封装,实际应用过程中不用自己写,此处只为了解其原理 15 */ 16 public class ProxyTest { 17 18 public static void main(String[] args) { 19 //目标对象 20 final Target target = new Target(); 21 //增强对象 22 final Advice advice = new Advice(); 23 24 //获取动态生成的代理对象 25 //1 创建增强器 26 Enhancer enhancer = new Enhancer(); 27 //2 设置父类(目标) 28 enhancer.setSuperclass(Target.class); 29 //3 设置回调 30 enhancer.setCallback(new MethodInterceptor() { 31 @Override 32 public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { 33 advice.before(); //执行前置增强 34 Object invoke = method.invoke(target, args); //执行目标方法 35 advice.after(); //执行后置增强 36 return invoke; 37 } 38 }); 39 //4 创建代理对象 40 Target proxy = (Target)enhancer.create(); 41 42 //调用代理对象的方法 43 proxy.save(); 44 } 45 /* 46 前置增强。。。 47 save running... 48 后置增强。。。 49 */ 50 51 }
AOP重要概念
AOP开发需要明确的事项
AOP知识点总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!