springAop源码分析(二)

springAop源码分析(二)

一、接上篇博客,分析右半部分图
在这里插入图片描述
二、源码分析
在这里插入图片描述

public List<Advisor> buildAspectJAdvisors() {
    
    
		List<String> aspectNames = this.aspectBeanNames;

		if (aspectNames == null) {
    
    
			synchronized (this) {
    
    
				aspectNames = this.aspectBeanNames;
				if (aspectNames == null) {
    
    
					List<Advisor> advisors = new LinkedList<Advisor>();
					aspectNames = new LinkedList<String>();
					//获取容器中所有组件的名称
					String[] beanNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
							this.beanFactory, Object.class, true, false);
							//循环名称
					for (String beanName : beanNames) {
    
    
						if (!isEligibleBean(beanName)) {
    
    
							continue;
						}
						// We must be careful not to instantiate beans eagerly as in this case they
						// would be cached by the Spring container but would not have been weaved.
						//根据名称获取类型
						Class<?> beanType = this.beanFactory.getType(beanName);
						if (beanType == null) {
    
    
							continue;
						}
						//判断是否是切面类
						if (this.advisorFactory.isAspect(beanType)) {
    
    
							aspectNames.add(beanName);
							AspectMetadata amd = new AspectMetadata(beanType, beanName);
							if (amd.getAjType().getPerClause().getKind() == PerClauseKind.SINGLETON) {
    
    
								MetadataAwareAspectInstanceFactory factory =
										new BeanFactoryAspectInstanceFactory(this.beanFactory, beanName);
										//重点,寻找增强器
								List<Advisor> classAdvisors = this.advisorFactory.getAdvisors(factory);
								if (this.beanFactory.isSingleton(beanName)) {
    
    
								 //放入缓存中
									this.advisorsCache.put(beanName, classAdvisors);
								}
								else {
    
    
									this.aspectFactoryCache.put(beanName, factory);
								}
								advisors.addAll(classAdvisors);
							}
							else {
    
    
								// Per target or per this.
								if (this.beanFactory.isSingleton(beanName)) {
    
    
									throw new IllegalArgumentException("Bean with name '" + beanName +
											"' is a singleton, but aspect instantiation model is not singleton");
								}
								MetadataAwareAspectInstanceFactory factory =
										new PrototypeAspectInstanceFactory(this.beanFactory, beanName);
								this.aspectFactoryCache.put(beanName, factory);
								advisors.addAll(this.advisorFactory.getAdvisors(factory));
							}
						}
					}
					this.aspectBeanNames = aspectNames;
					return advisors;
				}
			}
		}

		if (aspectNames.isEmpty()) {
    
    
			return Collections.emptyList();
		}
		List<Advisor> advisors = new LinkedList<Advisor>();
		for (String aspectName : aspectNames) {
    
    
			List<Advisor> cachedAdvisors = this.advisorsCache.get(aspectName);
			if (cachedAdvisors != null) {
    
    
				advisors.addAll(cachedAdvisors);
			}
			else {
    
    
				MetadataAwareAspectInstanceFactory factory = this.aspectFactoryCache.get(aspectName);
				advisors.addAll(this.advisorFactory.getAdvisors(factory));
			}
		}
		return advisors;
	}

判断是否是切面类主要看是否有aspect注解
在这里插入图片描述
在这里插入图片描述
排除pointcut注解的方法
在这里插入图片描述
在这里插入图片描述

public InstantiationModelAwarePointcutAdvisorImpl(AspectJExpressionPointcut declaredPointcut,
			Method aspectJAdviceMethod, AspectJAdvisorFactory aspectJAdvisorFactory,
			MetadataAwareAspectInstanceFactory aspectInstanceFactory, int declarationOrder, String aspectName) {
    
    

		this.declaredPointcut = declaredPointcut;
		this.declaringClass = aspectJAdviceMethod.getDeclaringClass();
		this.methodName = aspectJAdviceMethod.getName();
		this.parameterTypes = aspectJAdviceMethod.getParameterTypes();
		this.aspectJAdviceMethod = aspectJAdviceMethod;
		this.aspectJAdvisorFactory = aspectJAdvisorFactory;
		this.aspectInstanceFactory = aspectInstanceFactory;
		this.declarationOrder = declarationOrder;
		this.aspectName = aspectName;

		if (aspectInstanceFactory.getAspectMetadata().isLazilyInstantiated()) {
    
    
			// Static part of the pointcut is a lazy type.
			Pointcut preInstantiationPointcut = Pointcuts.union(
					aspectInstanceFactory.getAspectMetadata().getPerClausePointcut(), this.declaredPointcut);

			// Make it dynamic: must mutate from pre-instantiation to post-instantiation state.
			// If it's not a dynamic pointcut, it may be optimized out
			// by the Spring AOP infrastructure after the first evaluation.
			this.pointcut = new PerTargetInstantiationModelPointcut(
					this.declaredPointcut, preInstantiationPointcut, aspectInstanceFactory);
			this.lazy = true;
		}
		else {
    
    
			// A singleton aspect.
			this.pointcut = this.declaredPointcut;
			this.lazy = false;
			//实例化切面
			this.instantiatedAdvice = instantiateAdvice(this.declaredPointcut);
		}
	}
private Advice instantiateAdvice(AspectJExpressionPointcut pcut) {
    
    
		return this.aspectJAdvisorFactory.getAdvice(this.aspectJAdviceMethod, pcut,
				this.aspectInstanceFactory, this.declarationOrder, this.aspectName);
	}

在这里插入图片描述

	private static final Class<?>[] ASPECTJ_ANNOTATION_CLASSES = new Class<?>[] {
    
    
			Pointcut.class, Around.class, Before.class, After.class, AfterReturning.class, AfterThrowing.class};

	protected static AspectJAnnotation<?> findAspectJAnnotationOnMethod(Method method) {
    
    
		for (Class<?> clazz : ASPECTJ_ANNOTATION_CLASSES) {
    
    
			AspectJAnnotation<?> foundAnnotation = findAnnotation(method, (Class<Annotation>) clazz);
			if (foundAnnotation != null) {
    
    
				return foundAnnotation;
			}
		}
		return null;
	}

根据注解的类型,实例化相应的切面类
在这里插入图片描述
返回加入到集合中
在这里插入图片描述
将返回的结合,加入到map缓存中
在这里插入图片描述
在这里插入图片描述
返回加入到集合中
在这里插入图片描述
三、结束,到此所有的增强器都已经找到,并缓存了起来。

猜你喜欢

转载自blog.csdn.net/mlplds/article/details/103157807