Spring AOP动态代理之JDK代理

前言


我们都知道AOP中的代理就是由AOP框架动态生成的一个对象,该对象可以作为目标对象使用。此处讲解Spring中的AOP代理之JDK动态代理。

JDK代理是什么

JDK动态代理是通过java.lang.reflect.Proxy类来实现的,我们可以调用Proxy了的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现AOP.

实战

1.创建接口UserDao类

package com.aop.jdk;

public interface UseDao {
    public void addUser();
    public void deleteUser();
}

2.创建目标类UserDaoImpl实现UserDao接口

package com.aop.jdk;
import com.ioc.UserDao;

//目标类
public class UserDaoImpl implements UseDao {
    @Override
    public void addUser() {
        System.out.println("添加用户");
    }

    @Override
    public void deleteUser() {
        System.out.println("删除用户");
    }
}

3.创建切面类MyAspect

package com.aop.jdk;

//切面类:可以存在多个通知Advice(即增强的方法)
public class MyAspect {
    public void check_Permission(){
        System.out.println("模拟检查权限");
    }
    public void log(){
        System.out.println("模拟记录日志");
    }
}

4.创建代理类JdkProxy

package com.aop.jdk;

import org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer;

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


//动态代理
public class JdkProxy implements InvocationHandler{
    //声明目标类接口
    private UseDao useDao;
    //创建代理方法
    public Object createProxy(UseDao useDao){
        this.useDao = useDao;
        //类加载器
        ClassLoader classLoader = JdkProxy.class.getClassLoader();
        //被代理对象实现的所有接口
        Class[] clazz = useDao.getClass().getInterfaces();
        //使用代理类进行增强,返回的是代理后的对象
        return Proxy.newProxyInstance(classLoader,clazz,this);
    }
    /*
    * 所有动态代理类的方法调用,都会交由invoke()方法区处理
    * proxy 被代理后的对象
    *method将要执行的方法信息(反射)
    * args执行方法时需要的参数
    * */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //声明切面
        MyAspect myAspect = new MyAspect();
        //前增强
        myAspect.check_Permission();
        //在目标类上调用方法,并传入参数
        Object obj = method.invoke(useDao, args);
        //后增强
        myAspect.log();
        return obj;


    }

}

5.创建测试类

package com.aop.jdk;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class TestJdk {
    public static void main(String[] args) {
        //创建代理对象
        JdkProxy jdkProxy = new JdkProxy();
        //创建目标对象
        UseDao useDao = new UserDaoImpl();
        //从代理对象中获取增强后的目标对象
        UseDao useDao1 = (UseDao) jdkProxy.createProxy(useDao);
        useDao1.addUser();
        useDao1.deleteUser();
    }


}

运行结果
Spring AOP动态代理之JDK代理_第1张图片

扫描关注下面二维码获得更多有用的资源!
Spring AOP动态代理之JDK代理_第2张图片

你可能感兴趣的:(spring)