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 事务代理配置
结合spring框架实现的动态代理代理,spring,Proxy
spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理
在spring中获取代理对象代理的目标对象工具类
spring动态代理类的示范小版本很简单的例子
spring aop jdk 动态代理的底层实现解析模拟
spring proxy代理模仿 提练出来了
对spring代理机制的实现和原理的详细讲解
描述了spring动态代理德原理,对于一些初学者来说,理解起来也是更加容易!
结合spring框架实现的静态代理,接口回掉
Spring专题与案例 Spring代理 静态代理和动态代理 Spring专题与案例-代理(静态和动态) Spring专题与案例-代理(静态和动态)
spring实现的自动代理配置!用到的关键类org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理
Spring AOP代理详细介绍 前言: 一开始我对spring AOP还是属于一知半解的状态,这几天遇到一个问题,加上又查看了一些Spring相关知识,感觉对这个问题有了更深刻的认识。所以写下来分享一下。 我们知道,Spring支持...
SpringAOP动态代理 Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。 JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于...
Spring实现自动代理Demo,BeanNameAutoProxyCreator的运用,学习参考原理
Spring MVC中利用动态代理记录日志,通过注解的方式记录日志。Spring MVC+ Restful。
spring 事务代理配置