再也不怕面试官问spring service 是jdk动态代理还是cglib动态代理了 一文秒懂

该博客主要介绍了Spring AOP框架中如何选择使用JDK动态代理或CGLIB动态代理。当目标类实现了一个或多个接口时,Spring将使用JDK动态代理;而当配置要求优化、强制使用目标类代理或指定了接口时,将使用CGLIB代理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


package org.springframework.aop.framework;

import java.io.Serializable;
import java.lang.reflect.Proxy;

import org.springframework.aop.SpringProxy;

/**
 * Default {@link AopProxyFactory} implementation, 
 * creating either a CGLIB proxy or a JDK dynamic proxy.
 * 
 */
@SuppressWarnings("serial")
public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {

	@Override
	public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
		if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
			Class<?> targetClass = config.getTargetClass();
			if (targetClass == null) {
				throw new AopConfigException("TargetSource cannot determine target class: " +
						"Either an interface or a target is required for proxy creation.");
			}
			if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
			  //如果该controller、service、dao 实现了接口 使用jdk动态代理
				return new JdkDynamicAopProxy(config);
			}
			// 如果 AdvisedSupport#setOptimize 为TRUE 或者
			// 或者 AdvisedSupport#setProxyTargetClass 为TRUE
			// 或者 AdvisedSupport#setInterfaces 为TRUE
			//使用cglib动态代理
			return new ObjenesisCglibAopProxy(config);
		}
		else {
			return new JdkDynamicAopProxy(config);
		}
	}

总结

//如果该controller、service、dao 实现了接口 使用jdk动态代理

如果 AdvisedSupport#setOptimize 为TRUE 或者
// 或者 AdvisedSupport#setProxyTargetClass 为TRUE
// 或者 AdvisedSupport#setInterfaces 为TRUE
//使用cglib动态代理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值