09Spring - AOP底层实现

简介: 09Spring - AOP底层实现

AOP的底层实现

Spring的AOP的底层用到了两种代理机制:

JDK动态代理:

针对实现了接口的类产生代理

Cglib动态代理:

针对没有实现接口的类产生的代理,应用的是底层的字节码增强技术,生成当前类的子类对象

JDK动态代理增强一个类中的方法

public class MyJDKProxy implements InvocationHandler{
    private UserDao userDao;
    public MyJDKProxy(UserDao userDao) {
        this.userDao = userDao;
    }
    public UserDao createProxy(){
        UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),this);
        return userDaoProxy;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if("save".equals(method.getName())){
             System.out.println("权限校验");
        }
        return method.invoke(userDao,args);
    }
}

Cglib动态代理增强一个类中的方法

public class MyCgLibProxy implements MethodInterceptor{
    private CustomerDao mCustomerDao;
    public MyCgLibProxy(CustomerDao customerDao) {
        mCustomerDao = customerDao;
    }
    //生成代理方法:
    public CustomerDao createProxy(){
        //创建Cglib的核心类
        Enhancer enhancer = new Enhancer();
        //设置父类
        enhancer.setSuperClass(CustomerDao.class);
        //设置回调
        enhancer.setCallback(this);
        //生成代理
        CustomerDao customerDaoProxy = (CustomerDao)enhancer.create();
        return customerDaoProxy;
    }
    @Override
    public Object intercept(Object proxy,Method method,Object[] args,MethodProxy methodProxy) throws Throwable{
        if("delete".equals(method.getName())){
            Object obj = methodProxy.invokeSuper(proxy,args);
            System.out.println("日志记录====");
            return obj;
        }
        return methodProxy.invokeSuper(proxy,args);
    }
}

目录
相关文章
|
Java Spring 容器
【Spring AOP底层实现原理】
【Spring AOP底层实现原理】
153 0
|
6月前
|
XML Java 数据格式
5个点轻松搞定Spring AOP底层实现原理
AOP 也是 Spring 中一个较为重要的内容,相对于传统的 OOP 模式,AOP 有很多让人难以理解的地方,本篇文章将向大家介绍 AOP 的实现方法及其底层实现,内容包括:
87 1
|
6月前
|
运维 Java 程序员
Spring5深入浅出篇:AOP底层实现原理
该文档介绍了Spring AOP的底层实现原理,核心问题包括动态代理类的创建。JDK动态代理通过`Proxy.newProxyInstance()`创建接口的实现类,而CGlib则是通过子类继承父类的方式生成代理对象。文中还提供了JDK和CGlib动态代理的代码示例。最后总结,JDK代理基于接口,CGlib则基于继承父类来实现。
|
缓存 Java 编译器
Java深入理解AOP(什么是AOP,AOP底层实现原理、应用)
Java深入理解AOP(什么是AOP,AOP底层实现原理、应用)
|
Java C++ Spring
Spring - AOP之底层实现(动态代理 JDK VS CGLIB)
Spring - AOP之底层实现(动态代理 JDK VS CGLIB)
126 0
Spring - AOP之底层实现(动态代理 JDK VS CGLIB)
|
2月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
64 1
|
23天前
|
安全 Java 编译器
什么是AOP面向切面编程?怎么简单理解?
本文介绍了面向切面编程(AOP)的基本概念和原理,解释了如何通过分离横切关注点(如日志、事务管理等)来增强代码的模块化和可维护性。AOP的核心概念包括切面、连接点、切入点、通知和织入。文章还提供了一个使用Spring AOP的简单示例,展示了如何定义和应用切面。
65 1
什么是AOP面向切面编程?怎么简单理解?
|
27天前
|
XML Java 开发者
论面向方面的编程技术及其应用(AOP)
【11月更文挑战第2天】随着软件系统的规模和复杂度不断增加,传统的面向过程编程和面向对象编程(OOP)在应对横切关注点(如日志记录、事务管理、安全性检查等)时显得力不从心。面向方面的编程(Aspect-Oriented Programming,简称AOP)作为一种新的编程范式,通过将横切关注点与业务逻辑分离,提高了代码的可维护性、可重用性和可读性。本文首先概述了AOP的基本概念和技术原理,然后结合一个实际项目,详细阐述了在项目实践中使用AOP技术开发的具体步骤,最后分析了使用AOP的原因、开发过程中存在的问题及所使用的技术带来的实际应用效果。
54 5
|
1月前
|
Java 容器
AOP面向切面编程
AOP面向切面编程
43 0
|
2月前
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
【9月更文挑战第9天】AOP(面向切面编程)通过分离横切关注点提高模块化程度,如日志记录、事务管理等。Micronaut AOP基于动态代理机制,在应用启动时为带有特定注解的类生成代理对象,实现在运行时拦截方法调用并执行额外逻辑。通过简单示例展示了如何在不修改 `CalculatorService` 类的情况下记录 `add` 方法的参数和结果,仅需添加 `@Loggable` 注解即可。这不仅提高了代码的可维护性和可扩展性,还降低了引入新错误的风险。
48 13
下一篇
无影云桌面