码迷,mamicode.com
首页 > 编程语言 > 详细

Spring_cglib动态代理

时间:2015-11-04 22:50:56      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:

cglib-nodep-2.1_3.jar   cglibjar包

 

 

事务

 

package com.spring.cglibproxy;

public class Transaction {
    
    public void beginTransaction(){
        
        System.out.println("begin transcation");
    }
    
    public void commit(){
        
        System.out.println("commit");
    }

}

 

拦截器

package com.spring.cglibproxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class MyInterceptor implements MethodInterceptor {
    
    private Object target;  //目标类
    
    private Transaction transaction; //事务

    
    
    public MyInterceptor(Object target, Transaction transaction) {
        super();
        this.target = target;
        this.transaction = transaction;
    }


    //创建代理对象
    public  Object createProxy(){
        
        Enhancer enhancer=new Enhancer();//代码增强类
        enhancer.setCallback(this);//参数为拦截器
        enhancer.setSuperclass(target.getClass());//生成的代理类的父类是目标类
        
        //创建代理对象
        return enhancer.create();
        
    }
    
    

    @Override
    public Object intercept(Object arg0, Method method, Object[] arg2,
            MethodProxy arg3) throws Throwable {
        
        this.transaction.beginTransaction();
        method.invoke(target);
        this.transaction.commit();
        
        
        return null;
    }

}

 

目标类

package com.spring.cglibproxy;

public class PersonDaoImpl  {

    public void savePerson() {
        
        System.out.println("save person");

    }

    public void updatePerson() {
        System.out.println("update Person");
        
    }

}

 

 

测试

 

package com.spring.cglibproxy;

import org.junit.Test;


/**
 * 通过CGlib产生的代理对象,代理类是目标类的子类
 * 
 * jdkProxy和cglib的区别:
 *         cglibproxy生成的是代理类是目标类的子类
 *         jdkproxy 是代理类和目标类实现了共同的接口
 * 
 * 
 */
public class cglibProxyTest {
    
    @Test
    public void testcglib(){
        
        Object target=new PersonDaoImpl();
        
        Transaction transaction=new Transaction();
        
        MyInterceptor  interceptor=new MyInterceptor(target, transaction);
        
        
        //创建代理类返回目标类,可以不需要接口
        PersonDaoImpl personDao = (PersonDaoImpl) interceptor.createProxy();
        
        personDao.savePerson();
        
        
    }

}

 

 

CglibProoxy和JDKproxy的区别:

* jdkProxy和cglib的区别:
* cglibproxy生成的是代理类是目标类的子类
* jdkproxy 是代理类和目标类实现了共同的接口

Spring_cglib动态代理

标签:

原文地址:http://www.cnblogs.com/thinkpad/p/4937399.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!