cglib代理

JDK的Proxy实现代理要求被代理的目标对象必须实现一个接口,而如果目标对象没有实现接口则不能使用Proxy来代理。不过我们也可以借助cglib来实现代理,这样目标对象不必实现接口.

要代理的对象:com.spring305.test.aopCglib.UserDao.java

Java代码   收藏代码
  1. public class UserDao {  
  2.   
  3.     private String name;  
  4.   
  5.     public String getName() {  
  6.         return name;  
  7.     }  
  8.   
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.   
  13.     public UserDao(String name) {  
  14.         this.name = name;  
  15.     }  
  16.   
  17.     public UserDao() {  
  18.         // TODO Auto-generated constructor stub  
  19.     }  
  20.   
  21.     public void print1() {  
  22.         System.out.println(UserDao.class.toString() + " print1()");  
  23.     }  
  24.   
  25.     public void print2() {  
  26.         System.out.println(UserDao.class.toString() + " print2()");  
  27.     }  
  28. }  

 

 com.spring305.test.aopCglib.CglibFactory.java

Java代码   收藏代码
  1. import net.sf.cglib.proxy.Enhancer;  
  2. import net.sf.cglib.proxy.MethodInterceptor;  
  3. import net.sf.cglib.proxy.MethodProxy;  
  4. import java.lang.reflect.Method;  
  5.   
  6. public class CglibFactory implements MethodInterceptor {  
  7.   
  8.     private Object target;  
  9.   
  10.     public Object createUserDao(Object target) {  
  11.         this.target = target;  
  12.         //用enhancer类来创建代理对象  
  13.         Enhancer enhancer = new Enhancer();  
  14.         //设置父类,即为目标类  
  15.         enhancer.setSuperclass(this.target.getClass());  
  16.         // cglib创建的代理对象,其实就是继承了要代理的目标类,然后对目标类中所有非final方法进行覆盖,但在覆盖方法时会添加一些拦截代码。  
  17.         // 注册回调器,回调下面intercept  
  18.         enhancer.setCallback(this);   
  19.         //返回创建的代理对象  
  20.         return enhancer.create();  
  21.     }  
  22.   
  23.     @Override  
  24.     //参数依次代表:代理对象本身,被拦截到的方法,方法的参数,方法的代理对象  
  25.     //切面,指横切性关注点的抽象,与类相似,但是两者的关注点不同,类是对物体特征的抽象  
  26.     //连接点:指那些被拦截到的点,spring只支持方法类型的连接点  
  27.     //切入点:指我们要对连接点进行拦截的定义  
  28.     //通知:拦截到连接点后做的事情即为通知  
  29.     //Target,目标对象:代理的目标对象  
  30.     //织入:将aspectJ应用到target对象,并导致proxy对象创建的过程  
  31.     //引入:在不修改类代码前提下,引入可以在运行期为类动态地添加一些方法或者field  
  32.     public Object intercept(Object proxy, Method method, Object[] args,  
  33.             MethodProxy methodProxy) throws Throwable {//环绕通知  
  34.         UserDao udi = (UserDao) target;  
  35.         Object result = null;  
  36.         if (udi.getName() != null) {  
  37.             // 前置通知 advice()  
  38.             try {  
  39.                 result = methodProxy.invoke(target, args);  
  40.                 // 后置通知 afterAdvice()  
  41.             } catch (Exception e) {  
  42.                 e.printStackTrace();  
  43.                 // 例外通知 exceptionAdvice  
  44.             } finally {  
  45.                 // 最终通知  finalyAdvice  
  46.             }  
  47.         }  
  48.         return result;  
  49.     }  
  50. }  

 测试:

Java代码   收藏代码
  1. @Test  
  2.     public void cglibTest(){  
  3.         CglibFactory test = new CglibFactory();  
  4.         //UserDao dao = (UserDao)test.createUserDao(new UserDao());  
  5.         UserDao dao = (UserDao)test.createUserDao(new UserDao("aa"));  
  6.         dao.print1();  
  7.         dao.print2();  
  8.     }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值