博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
aop学习总结二------使用cglib动态代理简单实现aop功能
阅读量:5283 次
发布时间:2019-06-14

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

aop学习总结二------使用cglib动态代理简单实现aop功能

模拟业务需求:

1.拦截所有业务方法

2.判断用户是否有权限,有权限就允许用户执行业务方法,无权限不允许用户执行业务方法

(判断是否有权限是根据user是否为null

CGLIB的代理:目标对象没有实现接口

业务类:

package ql.service.impl;public class PersonServiceBean {    private String user=null;        public PersonServiceBean(){}        public PersonServiceBean(String user){            this.user=user;    }    public String getUser() {        return user;    }    public void setUser(String user) {        this.user = user;    }    public void save(String name) {        System.out.println("我是save()方法");    }    public void update(String name, Integer personId) {        System.out.println("我是update()方法");    }    public String getPersonName(Integer personId) {        System.out.println("我是getPersonName()方法");        return "success";    }}

CGLIB动态代理工厂类:

 

package ql.aop;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;import ql.service.impl.PersonServiceBean;public class CGLIBProxyFactory implements MethodInterceptor {    // 目标对象    private Object targetObject;    // 得到一个代理实例    public Object createProxyIntance(Object targetObject) {        this.targetObject = targetObject;        // 该类用于生产代理对象        Enhancer enhancer = new Enhancer();        // 继承了目标对象,对目标类的所有非final方法进行覆盖,并加上自己的代码        enhancer.setSuperclass(this.targetObject.getClass());        enhancer.setCallback(this);        return enhancer.create();    }    public Object intercept(Object proxy, Method method, Object[] args,            MethodProxy methodProxy) throws Throwable {        PersonServiceBean bean = (PersonServiceBean) this.targetObject;        Object result = null;        if (bean.getUser() != null) {            result = methodProxy.invoke(targetObject, args);        }        return result;    }}

 

单元测试类:

package ql.test;import org.junit.Before;import org.junit.Test;import ql.aop.CGLIBProxyFactory;import ql.service.impl.PersonServiceBean;public class ProxyTest {    @Before    public void setUp() throws Exception {    }    @Test    public void testCGLIBProxyFactory1() {                CGLIBProxyFactory cglibProxyFactory=new CGLIBProxyFactory();        PersonServiceBean personServiceBean=(PersonServiceBean) cglibProxyFactory.createProxyIntance(new PersonServiceBean());        personServiceBean.save("小明");    }    @Test    public void testCGLIBProxyFactory2() {        CGLIBProxyFactory cglibProxyFactory=new CGLIBProxyFactory();        PersonServiceBean personServiceBean=(PersonServiceBean) cglibProxyFactory.createProxyIntance(new PersonServiceBean("xxxx"));        personServiceBean.save("小明");    }}

 

转载于:https://www.cnblogs.com/ql211lin/p/4552169.html

你可能感兴趣的文章
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
线程池的概念
查看>>
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
SWIFT国际资金清算系统
查看>>
站立会议第四天
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>
UVa 11059 最大乘积
查看>>
数组分割问题求两个子数组的和差值的小
查看>>
composer 报 zlib_decode(): data error
查看>>
hdu 3938 并查集
查看>>