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

目录
相关文章
|
4天前
|
Java Maven 数据安全/隐私保护
详解 Java AOP:面向方面编程的核心概念与 Spring 实现
详解 Java AOP:面向方面编程的核心概念与 Spring 实现
16 1
|
2天前
|
设计模式 网络安全 开发工具
|
2天前
|
XML 安全 Java
Spring高手之路19——Spring AOP注解指南
在本文中,我们将深入探索Spring AOP(面向切面编程)的核心概念及其在现代Spring应用中的实际应用。从基本的注解使用到复杂的切面配置,本文将一步步指导你如何利用Spring AOP提升代码的模块化,帮助你在Spring开发路上更进一步。
16 3
Spring高手之路19——Spring AOP注解指南
|
5天前
|
缓存 Java uml
Spring压轴题:当循环依赖遇上Spring AOP
Spring压轴题:当循环依赖遇上Spring AOP
13 1
|
6天前
|
XML 监控 Java
Java一分钟之-Spring AOP:基于Spring的AOP
【6月更文挑战第13天】Spring框架集成AOP支持,便于实现如日志、监控和事务管理等关注点的集中管理。本文探讨Spring AOP的核心概念(切面、切入点、通知和代理),常见问题(代理对象理解不清、切入点表达式错误、通知类型混淆和事务管理配置不当)及其对策,并提供注解式日志记录代码示例。通过学习和实践,开发者能更好地运用Spring AOP提升代码质量。
16 2
|
15天前
|
Java Spring
【JavaEE进阶】 Spring AOP源码简单剖析
【JavaEE进阶】 Spring AOP源码简单剖析
|
15天前
|
Java Spring
【JavaEE进阶】 Spring AOP详解
【JavaEE进阶】 Spring AOP详解
|
15天前
|
数据采集 Java 程序员
【JavaEE进阶】 Spring AOP快速上手
【JavaEE进阶】 Spring AOP快速上手
|
21天前
|
Java Spring
|
21天前
|
Java Spring