spring aop 是如何实现的?

spring aop 是如何实现的?

要分析这个议题,我们以spring cache为例

spring cache是如何与spring整合的

  1. 在spring项目 spring-context下的META-INF\spring.handlers定义了
    org.springframework.cache.config.CacheNamespaceHandler,
    使用xml方式,次handler就是spring cache与spring整合的入口

  2. 重点解析类 AnnotationDrivenCacheBeanDefinitionParser,在该类的解析方法执行了
    AopNamespaceUtils.registerAutoProxyCreatorIfNecessary(parserContext, element);
    方法,此处就是在创建所需要的aop,跟踪该方法发现如下代码:

public static BeanDefinition registerAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, Object source) {
		return registerOrEscalateApcAsRequired(InfrastructureAdvisorAutoProxyCreator.class, registry, source);
	}

3.继续跟踪代码后,其实代码并不难里面就是创建 InfrastructureAdvisorAutoProxyCreator的bean定义
查看该类的继承结构,发现该类间接的继承了AbstractAutoProxyCreator类,而AbstractAutoProxyCreator
类实现 SmartInstantiationAwareBeanPostProcessor这个接口,在该接口的postProcessAfterInitialization
方法中我们看到了想要的实现,主要的实现在 wrapIfNecessary->getAdvicesAndAdvisorsForBean方法中

4.getAdvicesAndAdvisorsForBean->findEligibleAdvisors方法是spring aop实现的核心方法,该方法的主要逻辑如下

  • 通过findCandidateAdvisors查找当前spring上下文中所有候选的advisor(即aop切面)
  • 通过 findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName)判断当前正在初始化的bean
    是否可应用于候选的advisor的某些advisor,如果有则返回这些合格的advisor

5.查到合格的advisor后就为该bean创建指定advisor(切面/拦截器)的代理即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值