当前位置: 代码迷 >> 综合 >> Spring5.1源码阅读记录七 - Spring AOP源码分析
  详细解决方案

Spring5.1源码阅读记录七 - Spring AOP源码分析

热度:85   发布时间:2024-01-31 07:36:47.0

在上篇文章中学习了如何实现一个切面,
https://blog.csdn.net/u014533485/article/details/107536422
下面走进代码中看看Spring是如何实现AOP代理功能的。

一、@EnableAspectJAutoProxy注解

想要使用AOP的功能需要在配置类中启用这个注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {boolean proxyTargetClass() default false;boolean exposeProxy() default false;}

这个注解仅仅引入了AspectJAutoProxyRegistrar.class类,@Import这里就不讲了。也就是说这个类会在register()方法中引入到容器中。

二、AspectJAutoProxyRegistrar类

下面来看这个类的代码,首先这个类是SpringContext中的类。

class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {//将org.springframework.aop.config.internalAutoProxyCreator注入AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);}}

首先这个方法registerAspectJAnnotationAutoProxyCreatorIfNecessary()的意思是如果需要
注册AspectJ注释自动ProxyCreator
往这个方法里面走:

	@Nullablepublic static BeanDefinition registerAspectJAnnotationAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, @Nullable Object source) {return registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source);}
	@Nullableprivate static BeanDefinition registerOrEscalateApcAsRequired(Class<?> cls, BeanDefinitionRegistry registry, @Nullable Object source) {RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);beanDefinition.setSource(source);beanDefinition.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE);beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);return beanDefinition;}

很明显,这里就是将AnnotationAwareAspectJAutoProxyCreator.class作为BD注册到容器中!

下面我们看看这个类是什么

三、AspectJAutoProxyRegistrar类

AspectJAutoProxyRegistrar就是属于AOP包下的类了,至此就进入了AOP地盘

package org.springframework.aop.aspectj.annotation;
@SuppressWarnings("serial")
public class AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorAutoProxyCreator {@Nullableprivate List<Pattern> includePatterns;@Nullableprivate AspectJAdvisorFactory aspectJAdvisorFactory;@Nullableprivate BeanFactoryAspectJAdvisorsBuilder aspectJAdvisorsBuilder;....}

好,到这里先暂停。我们从代码执行角度来看

  相关解决方案