Spring代理模式——cglib

标签: SpringAop 代理模式 cglib
6人阅读 评论(0) 收藏 举报
分类:
3、Cglib代理


子类代理。在内存中构建一个子类对象从而实现目标对象的扩展
步骤:
引用jar文件--Spring Core包中包含
在内存中动态创建目标对象的子类 class edu.cloud.cglib.UserDao$$EnhancerByCGLIB$$9a0d63a4
注意:
目标对象不能是final的

目标对象的方法是final和static 的,否则不会拦截


目标对象:

package edu.cloud.cglib;


/**
 * 目标对象
 * @author huangbaida
 * @description 
 * @date 2018年1月23日
 */
public class UserDao {


public void save() throws Exception{
System.out.println("----数据保存----");
}


public void update() throws Exception{
System.out.println("----数据已修改----");
}

}

代理对象:

package edu.cloud.cglib;


import java.lang.reflect.Method;


import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;


public class ProxyFactory implements MethodInterceptor {
//目标对象
private Object target;

public ProxyFactory(Object target) {
this.target = target;
}

//代理对象
public Object getProxyInstance() {
//1.工具类
Enhancer en = new Enhancer();
//2.设置相应的父类
en.setSuperclass(target.getClass());
//3.设置回调方法
en.setCallback(this);
//4.创建代理对象
return en.create();
}

@Override
public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable {
//
System.out.println("开始事务");

//执行目标对象的方法
Object resultValue = method.invoke(target, arg2);

System.out.println("提交事务");
return resultValue;
}

}

测试:

package edu.cloud.cglib;


public class Test {



public static void main(String[] args) {
//目标对象
UserDao target = new UserDao();

//代理对象
UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();

try {
proxy.save();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println(proxy.getClass());
}


}

查看评论

Javascript 设计模式之代理模式【专家辅导】

-
  • 1970年01月01日 08:00

Spring中CGLib代理模式

Spring框架中CGLib动态代理的使用和一个实例。
  • pseudonym_
  • pseudonym_
  • 2017-06-11 22:54:25
  • 101

设计模式-代理模式(jdk代理和cglib代理详解)

说起代理模式,详细很多人早已经很理解,但对于我这个菜鸟,理解的可能还是不到位,写一次博客加深印象。 什么是代理模式呢?代理模式是常用的Java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要...
  • qq_27717967
  • qq_27717967
  • 2017-06-22 11:24:42
  • 594

框架 day37 Spring3,AOP,代理模式(动态/CGLIB/工厂bean),传统AOP,AspectJ框架(基于xml/注解),切入点表达式,jdbcTemplate

Spring3,AOP,代理模式(动态/CGLIB/工厂bean),传统AOP,AspectJ框架(基于xml/注解),切入点表达式,jdbcTemplate...
  • opopopwqwqwq
  • opopopwqwqwq
  • 2016-05-25 10:44:53
  • 5278

Spring的两种代理方式:JDK动态代理和CGLIB动态代理

代理模式代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象...
  • cckevincyh
  • cckevincyh
  • 2017-02-10 14:04:59
  • 13070

Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

第一种代理即Java的动态代理方式上一篇已经分析,在这里不再介绍,现在我们先来了解下GCLIB代理是什么?它又是怎样实现的?和Java动态代理有什么区别? cglib(Code Generati...
  • owen5630
  • owen5630
  • 2015-08-18 16:24:36
  • 2202

谈谈java的代理模式认识 三————CGLIB代理

接着上篇博客的代理模式,我们继续,上篇博客介绍了JDK的动态代理,但是JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,这样就存在一定的局限性。对于这种情况,我...
  • wangyongxia921
  • wangyongxia921
  • 2015-05-29 22:01:53
  • 2462

spring02 注解方式实现MVC、spring的继承、代理模式(静/动) :jdk动态代理,cglib动态代理

一、 注解:           1、 基础回顾            1、注解就是为了说明java中的某一个部分的作用(Type)            2、注解都可以用于哪个部分是@Tar...
  • qq_28139371
  • qq_28139371
  • 2016-01-02 10:33:38
  • 954

Spring动态代理用JDK还是用CGLIB?

切面编程是Spring中非常重要的一个模块,切面编程的实现原理是动态代理,那么动态代理又有两种实现方式,一种方法是直接实现JDK中的InvocationHandler接口,另一种方法是继承CGLIB。...
  • sinat_36246371
  • sinat_36246371
  • 2017-10-04 17:27:59
  • 396

代理模式之Cglib

package com.gewb.proxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; impor...
  • jamesge2010
  • jamesge2010
  • 2017-05-07 18:54:02
  • 121
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 1276
    排名: 4万+
    博客专栏
    最新评论