Spring学习心得(14)--cglib动态代理

来源:互联网 发布:卖家开通淘宝客条件 编辑:程序博客网 时间:2024/06/05 02:56
cglib动态代理与jdk代理的区别: 

首先要把这里写图片描述导入工作环境中

//日志类:public class Logger implements  interceptor{    @Override    public void interceptor() {        System.out.println("logging");    }}//权限类public class Privilege implements interceptor {    @Override    public void interceptor() {        System.out.println("privilege");    }}//安全框架类public class SecurityAssist implements  interceptor {    @Override    public void interceptor() {        System.out.println("i am security assist");    }}//目标类public class showSalaryImpl{    public void showSalary() {        System.out.println("show salary");    }}/** * 拦截器类,与jdk动态代理不一样的是,这里实现的时methodInterceptor接口。 * 而jdk的是invocationHandler接口 */public class showSalaryInterceptor implements MethodInterceptor {    //导入目标类    private Object target;    //导入切面    private List<interceptor> interceptors;    //用构造函数方法给它们赋值    public showSalaryInterceptor(Object target,List<interceptor> interceptors) {        this.target = target;        this.interceptors=interceptors;    }    /**     * 这个就是相对于jdk的invoke方法     * argo-2跟jdk的invoke的前三个参数一样     * arg3是新增的,有查看方法名称等功能     */    @Override    public Object intercept(Object arg0, Method arg1, Object[] arg2,            MethodProxy arg3) throws Throwable {        //先运行完拦截器里面的内容再操作        for(interceptor interceptor1:interceptors){            interceptor1.interceptor();        }        arg1.invoke(this.target, arg2);        return null;    }    /**获取代理对象。。固定写法     * 这个方法也可以写在客户端上,     * @return     */    public Object getProxy(){        Enhancer enhancer=new Enhancer();        enhancer.setCallback(this);        enhancer.setSuperclass(this.target.getClass());        return enhancer.create();    }}//测试类:public class testCGlib {    @Test    public void testCGLIB(){        //新建切面对象        Logger logger=new Logger();        Privilege privilege=new Privilege();        SecurityAssist assist=new SecurityAssist();        //把切面对象加到集合众        List<interceptor> interceptors=new ArrayList<interceptor>();        interceptors.add(logger);        interceptors.add(privilege);        interceptors.add(assist);        //新建目标类对象        Object target=new showSalaryImpl();        //新建拦截器对象        showSalaryInterceptor interceptor=new showSalaryInterceptor(target,interceptors);        //新建代理对象        showSalaryImpl showSalary=(showSalaryImpl) interceptor.getProxy();        //操作        showSalary.showSalary();    }}
运行结果: 
这里写图片描述

0 0
原创粉丝点击