欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring学习笔记_AOP的cglib动态代理底层实现方式

程序员文章站 2022-07-12 14:30:02
...

单独使用cglib是需要到jar的。
当在spring中使用时cglib的部分随着spring-context.jar的导入已经引用了。
Spring学习笔记_AOP的cglib动态代理底层实现方式

Target目标对象

package com.cvicse.ump.proxy.jdk.impl;

import com.cvicse.ump.proxy.jdk.TargetInterface;

/**
 * 目标对象
 */
public class Target implements TargetInterface {
    /**
     * 目标方法
     */
    public void save() {
        System.out.println("runing.......");
    }
}

Advice增强对象

package com.cvicse.ump.advice;

/**
 * 增强对象
 */
public class Advice {
    public void before(){
        System.out.println("前置增强.....");
    }
    public void after(){
        System.out.println("后置增强.....");
    }
}

模拟AOP底层的cglib动态代理

package com.cvicse.test;

import com.cvicse.ump.advice.Advice;
import com.cvicse.ump.cglib.impl.Target;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class cglibProxyTest {
    public static void main(String[] args) {
        //创建目标对象
        final Target target=new Target();
        //创建增强对象
        final Advice advice = new Advice();
        //生成动态代理对象
        //1.创建增强器
        Enhancer enhancer=new Enhancer();
        //2.设置父类(目标)
        enhancer.setSuperclass(Target.class);
        //3.设置回调(这里需要一个callback的接口对象,一般用它的如下实现类)
        //methodProxy是方法的代理对象,暂时不用管
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                //执行前置
                advice.before();
                //执行目标
                Object invoke = method.invoke(target, args);
                //执行后置
                advice.after();
                return invoke;
            }
        });
        //4.创建代理对象
        Target proxy = (Target) enhancer.create();
        //调用代理方法
        proxy.save();
    }
}

这里的写法是耦合死了的,这是因为我们只是模拟,使用AOP的时候代理对象的生成代码是AOP根据配置文件等信息动态生成的。

相关标签: 后端