需要的架包:在spring中提供对CGLIB的支持

  

一、JDK的动态代理

  1.接口IUserDao

 package cn.itcast.spring3.jdk.proxy;

 public interface IUserDao {

     public void add();
public void update(); }

  2.接口的实现类UserDaoImpl.java

 package cn.itcast.spring3.jdk.proxy;

 public class UserDaoImpl implements IUserDao {

     @Override
public void add() {
System.out.println("add......"); } @Override
public void update() {
System.out.println("update........."); } }

  3.JDKProxy.java

 package cn.itcast.spring3.jdk.proxy;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* jdk动态代理 这个是必须有接口和实现类
* 使用动态代理增强指定方法
* @author Administrator
*
*/
public class JDKProxy implements InvocationHandler { private IUserDao userDao;
public JDKProxy(IUserDao userDao) {
super();
this.userDao = userDao;
} public IUserDao createProxy(){
IUserDao proxy = (IUserDao) Proxy.newProxyInstance(userDao.getClass().getClassLoader(),
userDao.getClass().getInterfaces(), this);
return proxy;
} /**
* 所有的方法都要经过这个方法过滤
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("add".equals(method.getName())){
System.out.println("日志的记录");
Object result = method.invoke(userDao, args);
return result;
}
return method.invoke(userDao, args);
} }

  4.测试类:TestJdkProxy.java

 package cn.itcast.spring3.jdk.proxy;

 import org.junit.Test;

 public class TestJDKProxy {

     @Test
public void jdkProxyText(){
//创建真是对象
IUserDao userDao = new UserDaoImpl();
//创建一个代理对象
IUserDao proxy = new JDKProxy(userDao).createProxy();
proxy.add();
proxy.update();
} }

二、CGLIB的代理

  1.UserDao.java

 package cn.itcast.spring3.cglib.proxy;

 public class UserDao {

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

  2.CGLIBProxy.java

 package cn.itcast.spring3.cglib.proxy;

 import java.lang.reflect.Method;

 import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import org.springframework.util.ReflectionUtils.MethodCallback; /**
* 通过指定子类来实现代理
* 即任何一个类都可以代理
*
* @author Administrator
*
*/
public class CGLIBProxy implements MethodInterceptor { //你要代理的父类
private UserDao userDao; public CGLIBProxy(UserDao userDao) {
super();
this.userDao = userDao;
} //创建代理
public UserDao createProxy(){
/*
* 使用CGLIB生成代理
*/
//1.创建核心类 enhancer:增强
Enhancer enhancer = new Enhancer();
//2.为其设置父类
enhancer.setSuperclass(userDao.getClass());
//3.设置回调
enhancer.setCallback(this);
//4.创建代理
return (UserDao)enhancer.create(); } /**
* 对add方法进行增强
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
if("add".equals(method.getName())){
System.out.println("写入日志");
Object result = methodProxy.invokeSuper(proxy, args);
return result;
}
return methodProxy.invokeSuper(proxy, args);
} }

  3.TestCGLIBProxy.java

 package cn.itcast.spring3.cglib.proxy;

 import org.junit.Test;

 public class TestCGLIBProxy {

     @Test
public void CGLIBProxyTest(){
UserDao proxy = new CGLIBProxy(new UserDao()).createProxy();
proxy.add();
proxy.update();
} }

三、JDK的动态代理必须有接口,而CGLIB的代理,则不需要接口,即任何一个类都可以生成代理

CGLIB和JDK代理的更多相关文章

  1. jdk与cglib的动态代理

    JDK动态代理中包含一个类和一个接口: InvocationHandler接口: public interface InvocationHandler { public Object invoke(O ...

  2. 学习CGLIB与JDK动态代理的区别

    动态代理 代理模式是Java中常见的一种模式.代理又分为静态代理和动态代理.静态代理就是显式指定的代理,静态代理的优点是由程序员自行指定代理类并进行编译和运行,缺点是一个代理类只能对一个接口的实现类进 ...

  3. CGLIB 和 JDK生成动态代理类的区别(转)

    文章转自http://luyuanliang.iteye.com/blog/1137292 AOP 使用的设计模式就是代理模式,是对IOC设计的补充.为了扩展性,往往会加上反射,动态生成字节码,生成代 ...

  4. Cglib 与 JDK动态代理的运行性能比较

    都说 Cglib 创建的动态代理的运行性能比 JDK 动态代理能高出大概 10 倍,今日抱着怀疑精神验证了一下,发现情况有所不同,遂贴出实验结果,以供参考和讨论. 代码很简单,首先,定义一个 Test ...

  5. CGlib和JDK动态代理

    一.CGlib动态代理     JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的1:字节码技术,其原理是通过字节 ...

  6. spring cglib 与 jdk 动态代理

    1. 概述 JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理 Cglib动态代理是 利用asm开源包 把被代理类的clas ...

  7. CGLib与JDK的动态代理

    一.CGLib 简单介绍 CGLib (Code Generation Library) 是一个强大的,高性能,高质量的Code生成类库. 它能够在执行期扩展Java类与实现Java接口. Hiber ...

  8. Cglib 与 JDK动态代理

    作者:xiaolyuh 时间:2019/09/20 09:58 AOP 代理的两种实现: jdk是代理接口,私有方法必然不会存在在接口里,所以就不会被拦截到: cglib是子类,private的方法照 ...

  9. jdk代理与cglib代理

    1. jdk静态代理 jdk静态代理主要使用硬编码实现.他通过对在代理类中持有委托类的引用,来打到在委托类方法执行前和执行后进行处理,实现简单,容易理解. 代码如下: 1.业务逻辑接口 package ...

随机推荐

  1. [前言] 实现一个Android电子书阅读APP

    大家好,我是小方,我将在接下来的几篇文章中从零实现一个网络小说阅读器,从安卓编程最基础的部分讲起,直至成功完成我们的应用,从新建一个项目开始,不断添加新的代码,添加新的界面,循序渐进,涵盖所有我们需要 ...

  2. AIO75产品特征与优势

    第一章 系统一体化 AIO7的核心流程由供应链.生产制造.财务成本及自动化办公构成,是迄今为止国内最完善的ERP.OA .HR .MES一体化产品.通过CRM(客户关系)及DRP(分销)扩充出“营销通 ...

  3. oracle expdp和impdp常用命令选项

    一.expdp导出数据库 1.按用户导出 expdp scott/tiger@orcl DIRECTORY=oracle_dmp dumpfile=bak.dmp schemas=scott vers ...

  4. Linked List Cycle && Linked List Cycle II

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Note ...

  5. 获取手机 IP

    /** *  获取用户ip * *  @return 获取用户ip */ + (NSString *)getIPAddress { NSString *address = @"an erro ...

  6. mysql命令[转]

    来自:http://www.cnblogs.com/zhangzhu/archive/2013/07/04/3172486.html 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录my ...

  7. 字符集&各种编码&编码解码

    要理解乱码问题,首先需要理解几个概念:字符集.编码.编码规则.乱码 1. 字符集: 字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集(Charact ...

  8. (6)简单说说java中的线程

    先甩出来两种创建线程的方法: private static int count = 100; public static void main(String[] args) { // 用继承Thread ...

  9. (1) 类构造块,this(),static,单例模式串讲

    类构造块 在类只用一对大括号包含的内容,构造所有的对象时都会执行的内容,如果某个类有好几个够赞函数,公共部分抽取出来,放到构造块中. clas Boy { ... { syso("哭...& ...

  10. ELK5.0安装教程

    ELK升级后,安装稍微发生了点变化,在Elasticsearch中增加了很多资源上的限制,其他的倒是没什么变化.不过所有的安装都是基于JDK已经安装完的情况,且为1.8版本. 安装Elasticsea ...