@EnableAspectJAutoProxy注解源码学习

@EnableAspectJAutoProxy点进去,有两个Boolean类型变量:
一个:Boolean类型的proxyTargetClass 变量,true-cglib,false-java自带。默认false。
第二个Boolean类型变量:exposeProxy,控制代理的暴露方式,解决内部调用不能使用代理的场景,默认为false.
下面要用。
重点是:AspectJAutoProxyRegistrar.class,点进去

AspectJAutoProxyRegistrar

	public void registerBeanDefinitions(
			AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

// 核心是下面这句:将把AnnotationAwareAspectJAutoProxyCreator这个类定义为BeanDefinition放到spring容器中
		AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

		AnnotationAttributes enableAspectJAutoProxy =
				AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
		if (enableAspectJAutoProxy != null) {
			if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
				AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
			}
			if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
				AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
			}
		}
	}

点进去:AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

AopConfigUtils

	public static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(
			BeanDefinitionRegistry registry, @Nullable Object source) {
// registerOrEscalateApcAsRequired 这个方法是做bean放到spring容器中,我们重点看一下
//AnnotationAwareAspectJAutoProxyCreator 这个类
		return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);
	}

AnnotationAwareAspectJAutoProxyCreator

看一些类层次图
在这里插入图片描述
先看一下:AbstractAutoProxyCreator这个抽象类。这个方法postProcessBeforeInstantiation

public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
		Object cacheKey = getCacheKey(beanClass, beanName);
// 做校验,是否需要对bean进行代理(特殊的类,和已经被代理),
		if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) {
			if (this.advisedBeans.containsKey(cacheKey)) {
				return null;
			}
			if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) {
				this.advisedBeans.put(cacheKey, Boolean.FALSE);
				return null;
			}
		}

// 一般不指定,所以:targetSource是null,这不是关键代码 
		TargetSource targetSource = getCustomTargetSource(beanClass, beanName);
		if (targetSource != null) {
		
		}

		return null;
	}

postProcessAfterInitializatio

// 这个类,主要做,如果这个bean别标记为代理,就使用配置的拦截器生成一个代理
	public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
		if (bean != null) {
			Object cacheKey = getCacheKey(bean.getClass(), beanName);
			if (this.earlyProxyReferences.remove(cacheKey) != bean) {
			// 这是关键代码
				return wrapIfNecessary(bean, beanName, cacheKey);
			}
		}
		return bean;
	}

点进去

protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
		// 省略一些代码

		// Create proxy if we have advice.
		// 这步是关键,获取到配置的所有增强方法
		Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
		if (specificInterceptors != DO_NOT_PROXY) {
			this.advisedBeans.put(cacheKey, Boolean.TRUE);
			// 创建代理了,我们口中常说的JDK动态代理和Cglib动态代理就是在这边生成的。
			Object proxy = createProxy(
					bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
			this.proxyTypes.put(cacheKey, proxy.getClass());
			return proxy;
		}

		this.advisedBeans.put(cacheKey, Boolean.FALSE);
		return bean;
	}

如图
在这里插入图片描述
return proxyFactory.getProxy(getProxyClassLoader()); -> 从代理工厂拿到代理,ProxyFactory#getProxy方法 return createAopProxy().getProxy(classLoader); ->createAopProxy点进去,发现到了是 ProxyCreatorSupport类–>return getAopProxyFactory().createAopProxy(this);–>找其实现(只有一个实现类 DefaultAopProxyFactory)

如下

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)) {
			// 创建 jdk代理
				return new JdkDynamicAopProxy(config);
			}
			// 创建 cglib代理
			return new ObjenesisCglibAopProxy(config);
		}
		else {
			return new JdkDynamicAopProxy(config);
		}
	}

简单分析了Spring动态代理类的生成流程。

简单总结

@EnableAspectJAutoProxy;
AspectJAutoProxyRegistrar:注册AnnotationAwareAspectJAutoProxyCreator
AnnotationAwareAspectJAutoProxyCreator:AOP动态代理自动生成的处理类,其他类似的类有AspectJAwareAdvisorAutoProxyCreator和InfrastructureAdvisorAutoProxyCreator等;
AopConfigUtils:AOP配置工具类
ProxyFactory:代理工厂
AopProxy接口:常见实现类ObjenesisCglibAopProxy、JdkDynamicAopProxy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值