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月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
2月前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
70 5
|
2月前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
77 8
|
2月前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
2月前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
49 5
|
2月前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
49 4
|
2月前
|
安全 Java 开发者
AOP中的JDK动态代理与CGLIB动态代理:深度解析与实战模拟
【11月更文挑战第21天】面向切面编程(AOP,Aspect-Oriented Programming)是一种编程范式,它通过将横切关注点(cross-cutting concerns)与业务逻辑分离,以提高代码的可维护性和可重用性。在Java开发中,AOP的实现离不开动态代理技术,其中JDK动态代理和CGLIB动态代理是两种常用的方式。本文将从背景、历史、功能点、业务场景、底层逻辑等多个维度,深度解析这两种代理方式的区别,并通过Java示例进行模拟和比较。
77 5
|
2月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
45 0
|
Java 调度 Spring
在Spring中使用JDK定时器实现调度任务
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/9904611 在Spring中使用JDK定时器实现调度任务 作者:chszs,转载需注明。
830 0
|
3月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
256 2