`
morgan117
  • 浏览: 4414 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Spring 中的代理

阅读更多
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中获取代理对象代理的目标对象工具类

    本文将深入探讨如何在Spring中通过自定义工具类获取代理对象所代理的目标对象。 ### 核心概念:AOP与Spring Proxy 在理解如何获取目标对象之前,我们需要先了解Spring AOP的实现机制。Spring AOP主要通过动态代理...

    spring代理实现机制

    Spring 框架利用代理模式实现了强大的 AOP 功能,能够方便地将日志记录、权限检查等横切关注点加入到业务逻辑中,而无需修改原有的业务代码。Spring 支持两种类型的代理:静态代理与动态代理。 #### 二、静态代理与...

    spring动态代理类的示范小版本,很简单的例子

    在静态代理中,我们需要手动创建代理类并实现相同的方法,然后在代理类的方法中插入增强代码。相比于Spring动态代理,静态代理的灵活性较低,但理解起来相对简单。 通过学习这个简单的例子,我们可以更好地理解...

    spring+动态代理

    在本篇中,我们将深入探讨Spring如何使用动态代理以及其在实际开发中的应用。 动态代理的核心概念是JDK的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类用于创建一个代理对象,...

    spring proxy代理模仿

    在Spring框架中,代理代理是一种重要的机制,它允许我们在不修改原有对象代码的情况下,为对象增加额外的功能。这里我们探讨的“spring proxy代理模仿”主要指的是Spring AOP(面向切面编程)中的动态代理实现。...

    Spring 事务代理配置

    在深入探讨Spring事务代理配置之前,我们先简要回顾一下Spring...通过以上步骤,我们就可以在Spring中成功配置事务代理,使得应用程序中的业务方法能够自动进行事务管理,极大地提高了代码的可维护性和事务的一致性。

    Java Spring代理模式AOP-IOC分析

    Java Spring代理模式AOP-IOC分析 一、代理模式概述 在软件设计中,代理模式是一种常用的设计模式。它可以在不修改原始代码的情况下,扩展或修改原始对象的行为。代理模式可以分为静态代理和动态代理两种。静态代理...

    spring jdk动态代理

    在Spring AOP中,当配置了基于JDK的代理时,Spring会为每个需要拦截的方法创建一个代理对象。这个代理对象实现了目标对象的所有接口,因此可以在不修改原有代码的情况下,对方法调用进行拦截。当我们通过代理调用...

    spring动态代理

    Spring 动态代理是 Spring 框架中的一个重要特性,它允许我们在运行时自动生成代理对象,以便在方法调用前后执行额外的操作,比如事务管理、AOP(面向切面编程)等。动态代理主要涉及两个核心接口:`java.lang....

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

    spring-aop。以及把代理类 文件输出

    在本项目中,我们将探讨如何在Java 1.8环境下配置和使用Spring AOP,以及如何生成代理类。 首先,Spring AOP是Spring框架的核心组件之一,它通过代理模式实现。在Java 1.8环境下,Spring AOP支持两种类型的代理:...

    简单模拟spring cglib代理

    在CGLIB代理中,方法拦截是通过实现MethodInterceptor接口来完成的。当代理对象的方法被调用时,实际会先执行MethodInterceptor中的intercept方法。在这个方法中,开发者可以编写额外的逻辑,比如日志记录、权限检查...

    spring+静态代理

    在本主题"spring+静态代理"中,我们将深入探讨如何利用Spring框架来实现静态代理模式,并通过接口回调的方式来增强代码的灵活性和可扩展性。 静态代理是一种设计模式,它允许我们在不修改原始对象(被代理对象)的...

    Spring框架中JDK动态代理和cglib动态代理

    在 JDK 动态代理中,我们可以使用 InvocationHandler 来处理方法的调用。InvocationHandler 是一个接口,它定义了 invoke 方法,该方法将被代理对象的方法调用转发到 InvocationHandler 的 invoke 方法中。在 invoke...

    spring代理实现

    Spring框架中的代理实现是面向切面编程(AOP)的核心机制之一,它允许我们在不修改原有代码的情况下,为对象添加额外的功能。在这个资源中,我们可能会看到三种不同的代理方式:JDK动态代理、CGLIB代理以及Spring AOP...

    spring 的自动代理

    在非面向接口的代理拦截配置中,`service.PersonService` 类没有指定接口,所以 Spring 使用 CGLIB 代理来创建 `perService` Bean 的代理。CGLIB 代理是在运行时动态生成的子类,它继承了目标类,并在目标方法调用...

    Spring的静态代理和动态代理

    本篇我们将深入探讨Spring中的静态代理和动态代理,这两种代理模式在实际开发中都有广泛的应用。 首先,让我们理解什么是代理。代理模式是一种设计模式,它为一个对象提供一个代理以控制对这个对象的访问。在Spring...

    四、Spring源码分析——动态代理

    在Spring框架中,动态代理是实现AOP(面向切面编程)的核心技术之一。它允许我们在不修改原有代码的情况下,为方法添加额外的功能,如事务管理、日志记录等。本篇文章将深入探讨Spring中的动态代理机制,以及它是...

    Spring实现自动代理Demo

    在Spring框架中,自动代理是一种重要的特性,它允许我们在不修改原有代码的情况下,为bean添加额外的功能,如事务管理、AOP(面向切面编程)等。本篇将深入探讨如何利用Spring实现自动代理,特别是关注`...

Global site tag (gtag.js) - Google Analytics