博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring总结七:AOP动态代理的实现
阅读量:5173 次
发布时间:2019-06-13

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

Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。

首先我们来用代码简单演示jdk动态代理:

现在有一个商品的增删改查的操作

/** * 商品操作接口 */public interface ProductService {    public void add();    public void edit();    public void delte();    public void select();}/** * 实现类 */public class ProductServiceImpl implements ProductService {    @Override    public void add() {        System.out.println("添加商品");    }    @Override    public void edit() {        System.out.println("修改商品");    }    @Override    public void delte() {        System.out.println("删除商品");    }    @Override    public void select() {        System.out.println("查询商品");    }}

我们编写一个基于jdk的动态代理(实现InvocationHandler接口):

public class JdkProxy implements InvocationHandler {    //被代理的目标    private Object target;    //构造函数 传入目标对象    public JdkProxy(Object target) {        this.target = target;    }    //提供创建代理对象的方法    public Object createProxy() {        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);    }    /**     * 实现InvocationHandler接口的回调方法, 拦截目标对象所有方法都会执行invoke方法     */    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("我是代理,我对被代理的目标有绝对的控制权...");        Object returnVal = method.invoke(target, args);        System.out.println("--------------------------------------");        return returnVal;    }}

测试代码:

public class JdkProxyTest {    @Test    public void testJdkProxy() {        //创建对象        ProductService target = new ProductServiceImpl();        //创建代理对象        JdkProxy jdkProxy = new JdkProxy(target);        //代理面向接口        ProductService proxy = (ProductService) jdkProxy.createProxy();        //通过代理调用方法        proxy.add();        proxy.edit();        proxy.delte();        proxy.select();    }}

运行结果:

jdk的代理,目标必须有接口

 

而cglib的代理不管有没有接口都可以

下面简单说一下cglib的动态代理:

ProductService

public class ProductService {    public void add() {        System.out.println("添加商品");    }    public void edit() {        System.out.println("修改商品");    }    public void delte() {        System.out.println("删除商品");    }    public void select() {        System.out.println("查询商品");    }}

CglibProxy:

public class CglibProxy {    private Object target;    public CglibProxy(Object target) {        this.target = target;    }    public Object createProxy() {        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(target.getClass());        enhancer.setCallback(new MethodInterceptor() {            @Override            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {                // 增强的功能                System.out.println("这么巧,我也是代理.......................");                // 原来的功能                Object returnVal = method.invoke(target, args);                return returnVal;            }        });        // 返回 代理对象(增强之后的对象)        return enhancer.create();    }}

测试代码:

public class CglibProxyTest {    @Test    public void testCglibProxy() {        ProductService target = new ProductService();        CglibProxy cglibProxy = new CglibProxy(target);        ProductService proxy = (ProductService) cglibProxy.createProxy();        proxy.add();        proxy.edit();        proxy.delte();        proxy.select();    }}

运行结果:

 

其实除了动态代理,还有静态代理,以后总结设计模式的时候再详细说。

转载于:https://www.cnblogs.com/blazeZzz/p/9311045.html

你可能感兴趣的文章
动态将ASPX生成HTML网页并将网页导出PDF
查看>>
Find Backpacker Jobs in Australia
查看>>
面试题:return和finally执行
查看>>
Heroku第三方服务接入指南(二)
查看>>
MSRA专访摘要
查看>>
团队作业4
查看>>
随手一写,简单的四则运算练习
查看>>
第四次团队作业--选题
查看>>
记录专用
查看>>
一句实现jquery导航栏
查看>>
从零开始学 Web 之 Ajax(五)同步异步请求,数据格式
查看>>
场景分析:用户登录界面场景分析
查看>>
条形码生成包 BarCodeToHTML.cs(以颜色为背景的完整版)(下载的完整版)
查看>>
数据库事务的四大特性以及事务的隔离级别
查看>>
电脑屏幕保护眼睛
查看>>
有用的东西
查看>>
如何开启VMware串口
查看>>
数据库
查看>>
常见Struts、Hibernate、Spring、J2EE、ibatis、Oracle等开发框架架构图及其简介
查看>>
Java为何大行其道
查看>>