需要的架包:在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. fastcgi的介绍,原理及配置

    fastcgi介绍: CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序一般运行在网络服务器上. C ...

  2. Cloud9vue&vux上传github小步骤

    成功后创建出以下文件,再输入: git init 再输入:$ git remote add origin https://github.com/github用户名/vux1 然后:git add. 按 ...

  3. C#的数据类型、数据类型的转化

    一.c#有15个预定义类型,其中13个是值类型,两个是引用类型(string 和 object)这里主要说明整型.浮点型.布尔型以及引用型 1.整型数据 2.浮点型 浮点型从精度有低到高有float. ...

  4. 《深入理解Java虚拟机》学习笔记之字节码执行引擎

    Java虚拟机的执行引擎不管是解释执行还是编译执行,根据概念模型都具有统一的外观:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 栈帧(Stack Frame) ...

  5. Java系统属性与Preferences API的简单介绍

    系统属性在和Preferences API都是键值对,前者只能当前应用程序中共享数据,而后者可以在用户的各个应用或用户之间共享数据. 系统属性 Java 的系统属性决定了 Java 程序实际运行的环境 ...

  6. Visual Studio 2017 ASP.NET Core开发

    Visual Studio 2017 ASP.NET Core开发,Visual Studio 2017 已经内置ASP.NET Core 开发工具. 在选择.NET Core 功能安装以后就可以进行 ...

  7. ubuntu 笔记

    Ubuntu学习之路还很长,做个笔记也不亏 terminal tab 补全忽略大小写: 在 /ect/inputrc文件中添加或修改 'set completion-ignore-case on' U ...

  8. 使用Git将本地仓库与GitHub远程仓库相关联

    这篇文章详细讲解了如何生成SSH,并链接到GitHub,123..... 1.如果你的GitHub里面没有仓库,就自己生成一个,如图所示 2.如果你有自己仓库,想在电脑本地新建一个,你需要将GitHu ...

  9. Struts1.x 环境搭建和技术准备(上)

    Struts 1.x 基于 Servlet,Struts 2.x基于Filter 1.servlet的注解配置方式和web.xml配置方式 使用servelt 3.0,eclipse在创建seb项目是 ...

  10. volatile关键字和synchronized关键字

    volatile关键字: 可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性. synchron ...