需要的架包:在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. SESSION 与 COOKIE的区别是

    有以下几点 1.session是存在服务器端,cookie是存在客户端 2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,所以session安全性要比cookie ...

  2. Cocos2d-x中的CC_CALLBACK_X详解

    Cocos2d-x 3.x版本用CC_CALLBACK_0,CC_CALLBACK_1,CC_CALLBACK_2和CC_CALLBACK_3的宏来定义回调方法类的. 3.x版本的例子: child- ...

  3. DAX/PowerBI系列 - 父子层级(Parent-Child Hierarchy)

    DAX/PowerBI系列 - 父子层级(Parent-Child Hierarchy)参考文章见最后 难度: ◆◆◇◇◇(2星) 应用场景: 其实很多时候对数据汇总都会有层级关系的问题,不过说的不是 ...

  4. 详解Swing中JTree组件的功能

    JTree组件是另外一个复杂组件,它不像 JTable 那样难用,但是也不像 JList 那么容易.使用 JTree 时麻烦的部分是它要求的数据模型. JTree组件的功能来自树的概念,树有分支和叶子 ...

  5. 转换器3:手写PHP转Python编译器,词法部分

    上周写了<ThinkPhp模板转Flask.Django模板> 一时技痒,自然而然地想搞个大家伙,把整个PHP程序转成Python.不比模板,可以用正则匹配偷懒,这次非写一个Php编译器不 ...

  6. 3409: [Usaco2009 Oct]Barn Echoes 牛棚回声

    3409: [Usaco2009 Oct]Barn Echoes 牛棚回声 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 57  Solved: 47[ ...

  7. 3402: [Usaco2009 Open]Hide and Seek 捉迷藏

    3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 78  Solved: 6 ...

  8. mysql新建数据库时的collation选择(转)

    转自别处的文章.末尾附原文链接 mysql的collation大致的意思就是字符序.首先字符本来是不分大小的,那么对字符的>, = , < 操作就需要有个字符序的规则.collation做 ...

  9. Asp.Net MVC4中的全局过滤器,

    可以对整个项目进行全局监控. 新建一个MVC4项目,可以在global.asax文件中看到如下代码:  FilterConfig.RegisterGlobalFilters(GlobalFilters ...

  10. 配置Windows Server 2012服务器远程连接支持多人同时登陆

    1.运行输入gpedit.msc 进入组策略 2.计算机配置--管理模版--windows组件--远程桌面服务--远程桌面会话主机--连接 3.找到限制连接的数量,启用,并改为100. 4.找到 将远 ...