`
hb_wxd
  • 浏览: 6945 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java代理的两种实现

阅读更多
package dao;
public interface BookFacade {   
    public void addBook();   
}
--------------------------------
package dao.impl;

import dao.BookFacade;

public class BookFacadeImpl implements BookFacade {   
 
    public void addBook() {   
        System.out.println("add by jdk proxy");   
    }   
   
}   
--------------------------------
package proxy;

import java.lang.reflect.InvocationHandler;   
import java.lang.reflect.Method;   
import java.lang.reflect.Proxy;   

//JDK动态代理代理类  
public class BookFacadeProxy implements InvocationHandler {   
    private Object target;   
    /**  
     * 绑定委托对象并返回一个代理类  
     * @param target  
     * @return  
     */   
    public Object bind(Object target) {   
        this.target = target;   
        //取得代理对象   
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),   
                target.getClass().getInterfaces(), this);   //要绑定接口(这是一个缺陷,cglib弥补了这一缺陷)   
    }   
    
    /**  
     * 调用方法  
     */   
    public Object invoke(Object proxy, Method method, Object[] args)   
            throws Throwable {   
        Object result=null;   
        System.out.println("事物开始");   
        //执行方法   
        result=method.invoke(target, args);   
        System.out.println("事物结束");   
        return result;   
    }   
   
}   
--------------------------
package proxy;

import dao.BookFacade;
import dao.impl.*;

// 使用JDK的动态代理必须依靠接口实现
public class TestProxy {   
	   
    public static void main(String[] args) {   
        BookFacadeProxy proxy = new BookFacadeProxy();   
        BookFacade bookProxy = (BookFacade) proxy.bind(new BookFacadeImpl());   
        bookProxy.addBook();   
    }   
   
} 
/*
以上为java反射下的代理
*/
-------------------------------------------
package dao.cglib;

public class BookFacade  {   //未使用接口
 
    public void addBook() {   
        System.out.println("add by Cglib.");   
    }   
   
}   
--------------------------------------------
package proxy;

import java.lang.reflect.Method;   

import net.sf.cglib.proxy.Enhancer;   
import net.sf.cglib.proxy.MethodInterceptor;   
import net.sf.cglib.proxy.MethodProxy; 

 

// 实现MethodInterceptor的intercept(拦截器)
public class BookFacadeCglib implements MethodInterceptor  {   
    private Object target;   
    
    //创建代理对象  
    public Object getInstance(Object target) {   
        this.target = target;   
        Enhancer enhancer = new Enhancer();   
        enhancer.setSuperclass(this.target.getClass());   
        // 回调方法   
        enhancer.setCallback(this);   
        // 创建代理对象   
        return enhancer.create();   
    }   
      
    // 回调方法  (拦截器:默认拦截子类)--在这里可以做很多的文章哦
    public Object intercept(Object obj, Method method, Object[] args,   
            MethodProxy proxy) throws Throwable {   
        System.out.println("Begin");   
        
        proxy.invokeSuper(obj, args);   //obj调用对象,args参数列表
        System.out.println("End");   
        return null;   
   
   
    }   
   
}
----------------------------------------
package proxy;

import dao.cglib.BookFacade;

//使用cglib的代理
public class TestCglib {   
    
    public static void main(String[] args) {   
        BookFacadeCglib cglib=new BookFacadeCglib();   
        
        BookFacade bookCglib=(BookFacade)cglib.getInstance(new BookFacade());
        
        bookCglib.addBook();   
    }   
}

------------http://share.iteye.com/blog/1106718-------------
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起。
而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例。

cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
cglib封装了asm,可以在运行期动态生成新的class。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。

原理区别:

java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
分享到:
评论

相关推荐

    Java动态代理两种实现方式

    Java提供了两种主要的动态代理实现方式:JDK自身的动态代理(基于接口)和Cglib库。 ### JDK动态代理 JDK动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。Proxy类...

    Java两种代理模式案例

    在Java中,代理模式有两种主要实现方式:静态代理和动态代理。下面将详细介绍这两种代理模式,并结合`ProxyDemo`案例进行说明。 ### 1. 静态代理 静态代理是最基础的代理形式,它通过显式创建一个代理类来实现对...

    java三种方法实现代理模式(源码+jar包)

    本资源提供了三种实现代理模式的方法:静态代理、动态代理以及CGLIB代理,通过源码和jar包的形式供学习者参考。 1. **静态代理** 静态代理是最基础的代理方式,需要手动创建代理类并实现与目标类相同的接口。代理...

    Java实现动态代理

    Java中的动态代理主要有两种实现方式:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: JDK动态代理是基于接口的,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。...

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

    java实现的代理服务器

    Java 实现的代理服务器是一种基于Java编程语言的网络服务,它的主要作用是充当客户端与目标服务器之间的中介。这种代理服务器可以用于多种用途,包括数据抓取、匿名浏览、网络安全管理和性能优化等。在这个实例中,...

    java 代理例子 -javaagent,premain方式实现

    Java代理是一种在运行时增强或拦截对象方法调用的技术,它可以让我们在不修改原有代码的情况下,为类添加新的功能或行为。在Java中,代理主要分为两种:静态代理和动态代理。静态代理是通过手动创建代理类来实现的,...

    java分页 动态代理 aop实现

    在Java中,有两种实现动态代理的方式: 1. Java.lang.reflect.Proxy:使用Proxy类和InvocationHandler接口,可以为任何实现了相同接口的对象创建代理。 2. CGLIB库:当目标类没有实现接口时,CGLIB库可以通过字节码...

    java 动态代理实现注解日志拦截

    在Java中,动态代理主要由两个类实现:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类用于创建一个实现了特定接口的代理对象,而`InvocationHandler`接口则定义了处理代理对象...

    java代理机制 JDK动态代理和cglib代理 详解

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    JAVA静态代理和动态代理

    Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...

    Java静态代理与动态代理demo

    Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...

    Java 动态代理和Cglib代理(二)

    在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    在Java中,最常用的动态代理实现有两种:JDK Proxy和CGLIB。 - **JDK Proxy**:基于Java反射API实现,仅支持接口的代理。使用JDK Proxy时,需要指定被代理接口的类型,并且代理类必须实现该接口。 - **CGLIB**:...

    java动态代理模拟实现

    总结起来,Java动态代理提供了一种在运行时创建代理对象的机制,通过 `Proxy` 类和 `InvocationHandler` 接口,我们可以灵活地在方法调用前后插入自定义的行为,实现诸如日志、事务等附加功能,极大地增强了代码的可...

    java代理模式

    在Java中,代理模式主要有静态代理和动态代理两种实现方式。 一、静态代理 静态代理是在编译时就已经确定了代理关系。代理类和目标类需要实现相同的接口,这样代理类就可以持有目标类的引用,并在调用目标类方法...

    JAVA代理

    在Java中,代理主要有两种实现方式:静态代理和动态代理。 **静态代理** 在静态代理中,我们需要手动创建一个代理类,这个类通常会继承目标接口或者实现目标接口,并持有目标对象的引用。当调用代理类的方法时,...

    java代理类实现AOP

    在Java中,我们可以使用两种主要的方式来实现代理类:静态代理和动态代理。 1. 静态代理: 静态代理是在编译时就已经确定了代理关系,通过创建一个与目标类具有相同接口的代理类来实现。代理类通常会持有目标对象的...

    Java设计模式——代理设计模式(静态代理和动态代理)

    代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...

Global site tag (gtag.js) - Google Analytics