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

目录
相关文章
|
21天前
|
设计模式 Java 测试技术
spring复习04,静态代理动态代理,AOP
这篇文章讲解了Java代理模式的相关知识,包括静态代理和动态代理(JDK动态代理和CGLIB),以及AOP(面向切面编程)的概念和在Spring框架中的应用。文章还提供了详细的示例代码,演示了如何使用Spring AOP进行方法增强和代理对象的创建。
spring复习04,静态代理动态代理,AOP
|
4天前
|
Java 编译器 Spring
Spring AOP 和 AspectJ 的区别
Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌
17 2
|
11天前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
49 9
|
8天前
|
Java 关系型数据库 开发工具
idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案
本文提供了解决方案,如何在IDEA中创建Spring 2.X版本的项目并使用JDK8,尽管Spring 2.X已停止维护且IDEA不再直接支持,通过修改pom.xml或使用阿里云的国内源来创建项目。
22 0
idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案
|
3天前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
15 0
|
1月前
|
Java 数据库连接 数据库
Spring基础3——AOP,事务管理
AOP简介、入门案例、工作流程、切入点表达式、环绕通知、通知获取参数或返回值或异常、事务管理
Spring基础3——AOP,事务管理
|
2月前
|
缓存 Java 开发者
Spring高手之路22——AOP切面类的封装与解析
本篇文章深入解析了Spring AOP的工作机制,包括Advisor和TargetSource的构建与作用。通过详尽的源码分析和实际案例,帮助开发者全面理解AOP的核心技术,提升在实际项目中的应用能力。
33 0
Spring高手之路22——AOP切面类的封装与解析
|
2月前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
124 0
|
2月前
|
开发者 C# 容器
【独家揭秘】当WPF邂逅DirectX:看这两个技术如何联手打造令人惊艳的高性能图形渲染体验,从环境搭建到代码实践,一步步教你成为图形编程高手
【8月更文挑战第31天】本文通过代码示例详细介绍了如何在WPF应用中集成DirectX以实现高性能图形渲染。首先创建WPF项目并使用SharpDX作为桥梁,然后在XAML中定义承载DirectX内容的容器。接着,通过C#代码初始化DirectX环境,设置渲染逻辑,并在WPF窗口中绘制图形。此方法适用于从简单2D到复杂3D场景的各种图形处理需求,为WPF开发者提供了高性能图形渲染的技术支持和实践指导。
117 0
|
2月前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
45 0