Spring中的两种代理模式的实现原理

本文详细介绍了Spring中Jdk动态代理和CGLIB动态代理的实现原理,包括JdkDynamicAopProxy和CglibAopProxy的创建过程。Jdk动态代理依赖于接口,而CGLIB则是通过生成子类实现。Spring在处理自调用时,expose-proxy属性用于暴露代理对象。CGLIB与JDK代理在处理private方法上存在相同限制。
摘要由CSDN通过智能技术生成

代理模式

Jdk动态代理

通过反射机制,创建一个代理类对象实例并返回。用户进行方法调用时使用创建代理对象时,需要传递该业务类的类加载器(用来获取业务实现类的元数据,在包装方法是调用真正的业务方法)、接口、handler实现类,被代理的对象必须实现了某一个接口。

public <T> T getProxy(T target) {
   
		return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(),
				target.getClass().getInterfaces(), new MyInvocationHandler(
						target));
	}
CGLIB动态代理

一个java字节码的生成工具,它动态生成一个被代理类的子类,子类重写被代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑,通过增强器Enhancer和拦截器MethodInterceptor去实现。
创建代理的步骤:
生成代理类的二进制字节码文件;
加载二进制字节码,生成Class对象;
通过反射机制获得实例构造,并创建代理类对象

public static <T> T getObjectProxy(T target, Callback[] callbacks,
			CallbackFilter filter) {
   
		// 1、创建加强器用来创建动态代理
		Enhancer enhancer = new Enhancer();
		// 2 、为加强器指定要代理的业务类(即:为下面生成的代理类指定父类)
		enhancer.setSuperclass(target.getClass());
		// 3、 设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法进行拦
		// 3.1callback用于类的所有方法进行加强后返回
		// enhancer.setCallback(callback);
		// 3.2callbacks对指定的方法进行拦截,需要配置拦截链CallbackFilter
		enhancer.setCallbacks(callbacks);
		enhancer.setCallbackFilter(filter);
		// 4、创建动态代理类对象并返回
		return (T) enhancer.create();
	}

Spring创建动态代理

AbstractAutoProxyCreator根据配置获取到所有可以引用bean的增强器List以后,就需要为bean创建代理,Spring代理又分为JDK动态代理和CGLIB动态代理两种方式,所以按照常规方式,需要一个ProxyFactory去根据需求创建具体的Proxy对象,Spring也是这么去做的。

protected Object createProxy(
			Class<?> beanClass, String beanName, Object[] specificInterceptors, TargetSource targetSource) {
   

		if (this.beanFactory instanceof ConfigurableListableBeanFactory) {
   
			AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass);
		}
	  	//1、获取当前类钟的属性
		ProxyFactory proxyFactory = new ProxyFactory();
		proxyFactory.copyFrom(this);
		//2、添加代理接口
		if (!proxyFactory.isProxyTargetClass()) {
   
			if (shouldProxyTargetClass(beanClass, beanName)) {
   
				proxyFactory.setProxyTargetClass(true)
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值