JAVA高级SpringAOP动态代理模式

版权声明:有一种生活不去经历不知其中艰辛,有一种艰辛不去体会,不会知道其中快乐,有一种快乐,没有拥有不知其中纯粹 https://blog.csdn.net/wwwzydcom/article/details/82862500

 JAVA中jdk的代理模式

public class Test02 {
    public static void main (String[] args){
        JdkHandler jdkHandler  = new JdkHandler(new You());
        Marry marry = (Marry) jdkHandler.getProxy();
        marry.toMarry();
    }
}
package com.sxt;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 *  java动态代理机制接口:InvocationHandler
 *  API描述:每一二个动态代理实现InvocationHandler接口 关联一个handler,每个代理类实例关联到一个handler,当我们通过代理对象调用这个方法的时候,这个方法
 *  调用就会被转发到InvocationHandler这个接口的invoke方法来调用
 */
public class JdkHandler implements InvocationHandler{
    //代理的目标对象
    private Object target;
    //添加其构造方法
    public JdkHandler(Object target) {
        this.target = target;
    }

     /**
     *返回动态代理
      * 参数1 类加载器 classLoader 定义类哪个classLoader对象对生成的代理对象进行加载
      * 参数2 目标对象实现的接口数组 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果哦提供了一组接口给它
      * 这个代理对象宣称实现了该接口的多态,这样我就能调用这组接口中的方法了
      * 参数3 实现InvocationHandler 接口类对象 表示当我这个动态代理对象在调用方法的时候会关联哪一个Invocation对象上
     * @return
     */
    public Object getProxy() {

        return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    public void before(){
        System.out.println("前进前进!");
    }
    public void after(){
        System.out.println("后退后退!");
    }
    /**
     *
     * @param proxy 目标角色
     * @param method 调用目标角色的某个方法的method对象
     * @param args 调用目标角色接受的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result  = null;
        before();
        //当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
        result=method.invoke(target,args);
        after();
        return result;
    }


}

引入jar包

   <!-- https://mvnrepository.com/artifact/cglib/cglib -->
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.0</version>
        </dependency>
package com.sxt;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibInterceptor implements MethodInterceptor {

    private Object target;

    public CglibInterceptor(Object target) {
        this.target = target;
    }

    public Object getProxy(){
        Enhancer enhancer=new Enhancer();
        //设置父类 class
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return  enhancer.create();
    }




    public  void before(){
        System.out.println("新郎不要着急,车队正在快速飞奔中...");
    }

    public  void after(){
        System.out.println("恭喜您,成功进入人生第二阶段...");
    }
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Object result=null;
        before();
        result= methodProxy.invoke(target,objects);
        after();
        return result;
    }
}
package com.sxt;

public class Test03 {
    public static void main (String[] args){
        CglibInterceptor cglibInterceptor = new CglibInterceptor(new AccountService());
        //java.lang.NoClassDefFoundError: org/objectweb/asm/util/TraceClassVisitor不懂
        AccountService accountService= (AccountService) cglibInterceptor.getProxy();
        accountService.test();
    }
}

代码运行时出现

Exception in thread "main" java.lang.NoClassDefFoundError: org/objectweb/asm/util/TraceClassVisitor

等待解决

猜你喜欢

转载自blog.csdn.net/wwwzydcom/article/details/82862500