spring源码的xml解析过程-7(AOP 注解切面)

aop 注解切面配置

<aop:aspectj-autoproxy proxy-target-class="true"/>

org.springframework.aop.config.AopNamespaceHandler#init

//解析上面配置的xml标签
registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());

org.springframework.aop.config.AspectJAutoProxyBeanDefinitionParser#parse

AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element);

org.springframework.aop.config.AopNamespaceUtils#registerAspectJAnnotationAutoProxyCreatorIfNecessary

BeanDefinition beanDefinition = AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(
  parserContext.getRegistry(), parserContext.extractSource(sourceElement));

org.springframework.aop.config.AopConfigUtils#registerAspectJAnnotationAutoProxyCreatorIfNecessary(org.springframework.beans.factory.support.BeanDefinitionRegistry, java.lang.Object)

//aop 注解切面解析类
return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);

org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors

	@Override
	protected List<Advisor> findCandidateAdvisors() {
     
       
		List<Advisor> advisors = super.findCandidateAdvisors();
		// 将 类上标记有 @Aspect 的切面添加到集合中
		advisors.addAll(this.aspectJAdvisorsBuilder.buildAspectJAdvisors());
		return advisors;
	}

org.springframework.aop.aspectj.annotation.BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors

	String[] beanNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
							this.beanFactory, Object.class, true, false);
	for (String beanName : beanNames) {
     
	Class<?> beanType = this.beanFactory.getType(beanName);
		// bean 类上是否有 @Aspect 注解
		if (this.advisorFactory.isAspect(beanType)) {
     
		 //重点方法
		 List<Advisor> classAdvisors = this.advisorFactory.getAdvisors(factory);

		}
	}							

org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory#getAdvisors

	List<Advisor> advisors = new LinkedList<Advisor>();
	    // getAdvisorMethods: 解析 @Aspect 注解 中定义的切面方法
		for (Method method : getAdvisorMethods(aspectClass)) {
     
			Advisor advisor = getAdvisor(method, lazySingletonAspectInstanceFactory, advisors.size(), aspectName);
			if (advisor != null) {
     
				advisors.add(advisor);
			}
		}

org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory#getAdvisor

AspectJExpressionPointcut expressionPointcut = 
getPointcut(
				candidateAdviceMethod, aspectInstanceFactory.getAspectMetadata().getAspectClass());

org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory#getPointcut

@Before, @Around, @After, @AfterReturning, @AfterThrowing, @Pointcut 注解解析
AspectJAnnotation<?> aspectJAnnotation =				AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod(candidateAdviceMethod);

返回到
org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory#getAdvisor

AspectJExpressionPointcut expressionPointcut = getPointcut(
				candidateAdviceMethod, aspectInstanceFactory.getAspectMetadata().getAspectClass());
		if (expressionPointcut == null) {
     
			return null;
		}

// 创建 advisor 的实例
return new InstantiationModelAwarePointcutAdvisorImpl(expressionPointcut, candidateAdviceMethod,
				this, aspectInstanceFactory, declarationOrderInAspect, aspectName);

你可能感兴趣的:(Spring,系列)