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知识点总结

 

posted @   yub4by  阅读(34)  评论(0编辑  收藏  举报
编辑推荐:
· 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 让容器管理更轻松!
点击右上角即可分享
微信分享提示