博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AOP动态代理
阅读量:6316 次
发布时间:2019-06-22

本文共 3174 字,大约阅读时间需要 10 分钟。

1.JDK动态代理

UserDao类:

public interface UserDao {    public void addUser();}

UserDaoImpl类:

public class UserDaoImpl implements UserDao {    @Override    public void addUser() {        System.out.println("添加用户");    }}

MyAspect切面:

public class MyAspect {    public void check_permissions(){        System.out.println("检查权限");    }    public void log(){        System.out.println("记录日志");    }}

JdkProxy代理类:

public class JdkProxy implements InvocationHandler {    private UserDao userDao;    public Object createProxy(UserDao userDao) {        this.userDao = userDao;        //1.类加载器        ClassLoader loader = JdkProxy.class.getClassLoader();        //2.被代理对象实现的所有接口        Class[] classes = userDao.getClass().getInterfaces();        //3.使用代理类进行增强,返回代理后的对象        return Proxy.newProxyInstance(loader, classes, this);    }    /**     * @param proxy  被代理后的对象     * @param method 将要被执行方法的信息     * @param args   执行方法时需要的参数     * @return     * @throws Throwable     */    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        //创建切面        MyAspect myAspect = new MyAspect();        //前增强        myAspect.check_permissions();        //调用方法,并传参        Object obj = method.invoke(userDao, args);        //后增强        myAspect.log();        return obj;    }}

Test测试类:

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

 运行结果:

 

 

2.CGLIB代理

UserDao类:

public class UserDao {    public void delete(){        System.out.println("删除用户");    }}

MyAspect切面类同上

CglibProxy代理类:

import com.chauncey.jdk.MyAspect;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 CglibProxy implements MethodInterceptor {    public Object createProxy(Object target){        //创建动态对象        Enhancer enhancer = new Enhancer();        //确定要增强的类        enhancer.setSuperclass(target.getClass());        //添加回调函数        enhancer.setCallback(this);        //返回代理类        return enhancer.create();    }    /**     *     * @param o CGLIB根据指定父类生成对象     * @param method 拦截的方法     * @param objects 拦截方法参数的数组     * @param methodProxy 方法的代理对象,用于执行父类方法     * @return     * @throws Throwable     */    @Override    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {        MyAspect myAspect = new MyAspect();        myAspect.check_permissions();        Object obj = methodProxy.invokeSuper(o,objects);        myAspect.log();        return null;    }}

Test测试类:

public class Test {    public static void main(String[] args) {        //创建代理对象        CglibProxy proxy = new CglibProxy();        //创建目标类        UserDao userDao = new UserDao();        //获取增强后的目标对象        UserDao userDao1 = (UserDao) proxy.createProxy(userDao);        userDao1.delete();    }}

运行结果:

 

转载于:https://www.cnblogs.com/chaunceyji/p/10513684.html

你可能感兴趣的文章
Unity异常警告错误处理方法
查看>>
搭建基于asp.net的wcf服务,ios客户端调用的实现记录
查看>>
工作笔记还是蛮有用
查看>>
UIWindow,UINavigationController与UIViewController之间的关系
查看>>
基因突变的实例:加拿大无毛猫
查看>>
SQL Server中一个隐性的IO性能杀手-Forwarded record
查看>>
Windows Phone本地数据库(SQLCE):1、介绍(翻译)(转)
查看>>
Android SDK下载地址
查看>>
接口与virtual,override,new关键字
查看>>
无法对磁盘的“未指派”空间新建分区
查看>>
U盘1G变8M解决的方法
查看>>
爆:中国互联网的那些黑色产业链(转)
查看>>
IOS开发之获取Storyboard创建的ViewController
查看>>
Android ListView不响应OnItemClickListener解决办法
查看>>
数据结构~时间复杂度
查看>>
分享:三种取消选中单选框radio的方法
查看>>
【BZOJ】3391: [Usaco2004 Dec]Tree Cutting网络破坏(dfs)
查看>>
逆透视转换
查看>>
C/C++学习站点资源
查看>>
解决SqlServer 2005 sa帐户不能登录问题
查看>>