Spring - AOP之底层实现(动态代理 JDK VS CGLIB)

简介: Spring - AOP之底层实现(动态代理 JDK VS CGLIB)

image.png

packagecom.imooc.aop.demo1;
publicinterfaceUserDao {
publicvoidsave();
publicvoidupdate();
publicvoiddelete();
publicvoidfind();
}
packagecom.imooc.aop.demo1;
publicclassUserDaoImplimplementsUserDao {
publicvoidsave() {
System.out.println("保存用户...");
    }
publicvoidupdate() {
System.out.println("修改用户...");
    }
publicvoiddelete() {
System.out.println("删除用户...");
    }
publicvoidfind() {
System.out.println("查询用户...");
    }
}
packagecom.imooc.aop.demo1;
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.Method;
importjava.lang.reflect.Proxy;
publicclassMyJdkProxyimplementsInvocationHandler{
privateUserDaouserDao;
publicMyJdkProxy(UserDaouserDao){
this.userDao=userDao;
    }
publicObjectcreateProxy(){
Objectproxy=Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),this);
returnproxy;
    }
publicObjectinvoke(Objectproxy, Methodmethod, Object[] args) throwsThrowable {
if("save".equals(method.getName())){
System.out.println("权限校验...");
returnmethod.invoke(userDao,args);
        }
returnmethod.invoke(userDao,args);
    }
}
packagecom.imooc.aop.demo1;
importorg.junit.Test;
publicclassSpringDemo1 {
@Testpublicvoiddemo1(){
UserDaouserDao=newUserDaoImpl();
UserDaoproxy= (UserDao)newMyJdkProxy(userDao).createProxy();
proxy.save();
proxy.update();
proxy.delete();
proxy.find();
    }
}
运行结果:权限校验...
保存用户...
修改用户...
删除用户...
查询用户...

image.pngimage.png

packagecom.imooc.aop.demo2;
publicclassProductDao {
publicvoidsave(){
System.out.println("保存商品...");
    }
publicvoidupdate(){
System.out.println("修改商品...");
    }
publicvoiddelete(){
System.out.println("删除商品...");
    }
publicvoidfind(){
System.out.println("查询商品...");
    }
}
packagecom.imooc.aop.demo2;
importorg.springframework.cglib.proxy.Enhancer;
importorg.springframework.cglib.proxy.MethodInterceptor;
importorg.springframework.cglib.proxy.MethodProxy;
importjava.lang.reflect.Method;
publicclassMyCglibProxyimplementsMethodInterceptor{
privateProductDaoproductDao;
publicMyCglibProxy(ProductDaoproductDao){
this.productDao=productDao;
    }
publicObjectcreateProxy(){
// 1.创建核心类Enhancerenhancer=newEnhancer();
// 2.设置父类enhancer.setSuperclass(productDao.getClass());
// 3.设置回调enhancer.setCallback(this);
// 4.生成代理Objectproxy=enhancer.create();
returnproxy;
    }
publicObjectintercept(Objectproxy, Methodmethod, Object[] args, MethodProxymethodProxy) throwsThrowable {
if("save".equals(method.getName())){
System.out.println("权限校验===================");
returnmethodProxy.invokeSuper(proxy,args);
        }
returnmethodProxy.invokeSuper(proxy,args);
    }
}
packagecom.imooc.aop.demo2;
importorg.junit.Test;
publicclassSpringDemo2 {
@Testpublicvoiddemo1(){
ProductDaoproductDao=newProductDao();
ProductDaoproxy= (ProductDao) newMyCglibProxy(productDao).createProxy();
proxy.save();
proxy.update();
proxy.delete();
proxy.find();
    }
}
运行结果:权限校验===================保存商品...
修改商品...
删除商品...
查询商品...

image.png

目录
相关文章
|
2月前
|
运维 Java 程序员
Spring5深入浅出篇:Spring动态代理详解
# Spring动态代理详解 本文探讨了Spring中的MethodBeforeAdvice和MethodInterceptor在动态代理中的应用和差异。MethodBeforeAdvice在方法执行前执行额外功能,而MethodInterceptor则可在方法执行前后或抛出异常时运行额外逻辑。MethodInterceptor还能影响原始方法的返回值。
|
29天前
|
XML Java 数据格式
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))
21 0
|
29天前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
14 0
|
1月前
|
安全 Java API
JDK 11 vs JDK 8:探索Java的新特性和改进
JDK 11 vs JDK 8:探索Java的新特性和改进
|
1月前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
18 0
|
1月前
|
缓存 Java Maven
JDK 动态代理
JDK 动态代理
10 0
|
1月前
|
Java Spring
深入解析Spring源码,揭示JDK动态代理的工作原理。
深入解析Spring源码,揭示JDK动态代理的工作原理。
28 0
|
2月前
|
前端开发 Java 编译器
详解Spring与JDK注入
依赖注入是Spring框架的核心概念之一,它通过将对象之间的依赖关系外部化,实现了松耦合和可测试性。面向切面编程则允许开发人员将横切关注点(如日志、事务管理)从应用程序的主要业务逻辑中分离出来,以提高代码的模块化和可维护性。
33 4
|
2月前
|
设计模式 Java
JDK动态代理
JDK动态代理
|
22天前
|
IDE Oracle Java
day4:JDK、IntelliJ IDEA的安装和环境变量配置
【7月更文挑战第4天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
51 0