Spring中有两种方式进行Bean的代理:
1。JDK 动态代理
JDK主要通过Proxy.newProxyInstance(Classloader, Interface[], InvocationHandler)方法,生成一个与目标类实现相同
接口的代理类,这也是为什么Spring中经常出现ClassCastException: $Proxy can not be cast to xxx. 因为生成的代理类并不是目标类的子类。
InvocationHandler接口主要包含一个invoke(Object, Method, Object[])方法。第一个参数为生成的代理类,第二个为要执行的方法,第三个为方法参数。
2。Cglib代理
JDK动态代理只能代理interface,对于没有实现任何接口的类,我们只能使用另一个Cglib代理。Cglib采用非常底层的字节码技术,可以为一个类创建子类。 Cglib的核心类是Enhancer, 它为目标类创建代理实例,并可以通过setCallBack设置回调类(CallBack),最常见的类为MethodInterceptor. 该类的主要方法为intercept(Object, Method, Object[], ProxyMethod)
interface
package inter;
public interface PhoneInterface {
public void speak();
}
Bean
package Impl;
import inter.Phone;
import inter.PhoneInterface;
import javax.annotation.PostConstruct;
public class IPhone implements PhoneInterface{
public IPhone(int price, String name) {
super(price, name);
System.out.println("param construct");
}
public IPhone() {
System.out.println("default construct");
}
@Override
public void speak(){
System.out.println(this.getName()+" general speaks ");
}
}
JDK代理-InvocationHandler
package handler;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MethodHandler implements InvocationHandler {
private Object target;
public MethodHandler(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("call Method Name:"+method.getName());
System.out.println(proxy.getClass());
Object result = method.invoke(target, args);
return result;
}
}
JDK代理- 测试
package handler;
import inter.PhoneInterface;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import Impl.IPhone;
public class TestJDKProxy {
public static void main(String arg[]){
IPhone iphone = new IPhone();
InvocationHandler handler = new MethodHandler(iphone);
PhoneInterface phone = (PhoneInterface)Proxy.newProxyInstance(iphone.getClass().getClassLoader(), IPhone.class.getInterfaces(), handler);
phone.speak();
}
}
Cglib - MethodInterceptor
package cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import Impl.IPhone;
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object createProxy(Class c){
enhancer.setSuperclass(c);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object arg0, Method method, Object[] arg2,
MethodProxy proxy) throws Throwable {
System.out.println("Method "+method.getName()+" begin");
Object result = proxy.invokeSuper(arg0, arg2);
System.out.println("Method "+method.getName()+" end");
return result;
}
}
Cglib - 测试
package cglib;
import Impl.IPhone;
public class TestCglibProxy {
public static void main(String args[]){
CglibProxy cgProxy = new CglibProxy();
IPhone phone = new IPhone();
// ApplicationContext context = new FileSystemXmlApplicationContext("/src/beans.xml");
//
// IPhone phone = (IPhone)context.getBean("iphone");
IPhone p = (IPhone)cgProxy.createProxy(phone.getClass());
p.speak();
}
}
分享到:
相关推荐
本文将深入探讨如何在Spring中通过自定义工具类获取代理对象所代理的目标对象。 ### 核心概念:AOP与Spring Proxy 在理解如何获取目标对象之前,我们需要先了解Spring AOP的实现机制。Spring AOP主要通过动态代理...
Spring 框架利用代理模式实现了强大的 AOP 功能,能够方便地将日志记录、权限检查等横切关注点加入到业务逻辑中,而无需修改原有的业务代码。Spring 支持两种类型的代理:静态代理与动态代理。 #### 二、静态代理与...
在静态代理中,我们需要手动创建代理类并实现相同的方法,然后在代理类的方法中插入增强代码。相比于Spring动态代理,静态代理的灵活性较低,但理解起来相对简单。 通过学习这个简单的例子,我们可以更好地理解...
在本篇中,我们将深入探讨Spring如何使用动态代理以及其在实际开发中的应用。 动态代理的核心概念是JDK的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类用于创建一个代理对象,...
在Spring框架中,代理代理是一种重要的机制,它允许我们在不修改原有对象代码的情况下,为对象增加额外的功能。这里我们探讨的“spring proxy代理模仿”主要指的是Spring AOP(面向切面编程)中的动态代理实现。...
在深入探讨Spring事务代理配置之前,我们先简要回顾一下Spring...通过以上步骤,我们就可以在Spring中成功配置事务代理,使得应用程序中的业务方法能够自动进行事务管理,极大地提高了代码的可维护性和事务的一致性。
Java Spring代理模式AOP-IOC分析 一、代理模式概述 在软件设计中,代理模式是一种常用的设计模式。它可以在不修改原始代码的情况下,扩展或修改原始对象的行为。代理模式可以分为静态代理和动态代理两种。静态代理...
在Spring AOP中,当配置了基于JDK的代理时,Spring会为每个需要拦截的方法创建一个代理对象。这个代理对象实现了目标对象的所有接口,因此可以在不修改原有代码的情况下,对方法调用进行拦截。当我们通过代理调用...
Spring 动态代理是 Spring 框架中的一个重要特性,它允许我们在运行时自动生成代理对象,以便在方法调用前后执行额外的操作,比如事务管理、AOP(面向切面编程)等。动态代理主要涉及两个核心接口:`java.lang....
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
在本项目中,我们将探讨如何在Java 1.8环境下配置和使用Spring AOP,以及如何生成代理类。 首先,Spring AOP是Spring框架的核心组件之一,它通过代理模式实现。在Java 1.8环境下,Spring AOP支持两种类型的代理:...
在CGLIB代理中,方法拦截是通过实现MethodInterceptor接口来完成的。当代理对象的方法被调用时,实际会先执行MethodInterceptor中的intercept方法。在这个方法中,开发者可以编写额外的逻辑,比如日志记录、权限检查...
在本主题"spring+静态代理"中,我们将深入探讨如何利用Spring框架来实现静态代理模式,并通过接口回调的方式来增强代码的灵活性和可扩展性。 静态代理是一种设计模式,它允许我们在不修改原始对象(被代理对象)的...
在 JDK 动态代理中,我们可以使用 InvocationHandler 来处理方法的调用。InvocationHandler 是一个接口,它定义了 invoke 方法,该方法将被代理对象的方法调用转发到 InvocationHandler 的 invoke 方法中。在 invoke...
Spring框架中的代理实现是面向切面编程(AOP)的核心机制之一,它允许我们在不修改原有代码的情况下,为对象添加额外的功能。在这个资源中,我们可能会看到三种不同的代理方式:JDK动态代理、CGLIB代理以及Spring AOP...
在非面向接口的代理拦截配置中,`service.PersonService` 类没有指定接口,所以 Spring 使用 CGLIB 代理来创建 `perService` Bean 的代理。CGLIB 代理是在运行时动态生成的子类,它继承了目标类,并在目标方法调用...
本篇我们将深入探讨Spring中的静态代理和动态代理,这两种代理模式在实际开发中都有广泛的应用。 首先,让我们理解什么是代理。代理模式是一种设计模式,它为一个对象提供一个代理以控制对这个对象的访问。在Spring...
在Spring框架中,动态代理是实现AOP(面向切面编程)的核心技术之一。它允许我们在不修改原有代码的情况下,为方法添加额外的功能,如事务管理、日志记录等。本篇文章将深入探讨Spring中的动态代理机制,以及它是...
在Spring框架中,自动代理是一种重要的特性,它允许我们在不修改原有代码的情况下,为bean添加额外的功能,如事务管理、AOP(面向切面编程)等。本篇将深入探讨如何利用Spring实现自动代理,特别是关注`...