Spring源码解析(10)——获取增强器

获取增强器获取增强器的方法getAdvicesAndAdvisorsForBean是执行的AbstractAdvisorAutoProxyCreator这个类里面getAdvicesAndAdvisorsForBean方法。 @Override @Nullable protected Object[] getAdvicesAndAdvisorsForBean( Class<?> beanClass, String beanName, @Nullable TargetSource t
摘要由CSDN通过智能技术生成

获取增强器

获取增强器的方法getAdvicesAndAdvisorsForBean是执行的AbstractAdvisorAutoProxyCreator这个类里面getAdvicesAndAdvisorsForBean方法。

	@Override
	@Nullable
	protected Object[] getAdvicesAndAdvisorsForBean(
			Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) {
   
		//获取适用于当前bean的增强器
		List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName);
		//如果获取的增强器为空 则返回null
		if (advisors.isEmpty()) {
   
			return DO_NOT_PROXY;
		}
		return advisors.toArray();
	}

这里主要的逻辑在findEligibleAdvisors这个方法。

findEligibleAdvisors
	protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) {
   
		//获取所有的增强器
		List<Advisor> candidateAdvisors = findCandidateAdvisors();
		//从获取的增强器中筛选适用于当前bean的增强器
		List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);
		extendAdvisors(eligibleAdvisors);
		if (!eligibleAdvisors.isEmpty()) {
   
			eligibleAdvisors = sortAdvisors(eligibleAdvisors);
		}
		//返回适用于当前bean的增强器
		return eligibleAdvisors;
	}

这里主要的逻辑就是获取所有增强器(findCandidateAdvisors)和筛选适用于当前bean的增强器(findAdvisorsThatCanApply)。

findCandidateAdvisors

其实这个方法在前面执行shouldSkip这个方法的时候就已经执行过了,现在就是直接从缓存中拿数据。

@Override
protected List<Advisor> findCandidateAdvisors() {
   
	//获取配置文件中声明的增强器
	List<Advisor> advisors = super.findCandidateAdvisors();
	if (this.aspectJAdvisorsBuilder != null) {
   
		//获取AspectJ注解声明的类中的增强器
		advisors.addAll(this.aspectJAdvisorsBuilder.buildAspectJAdvisors());
	}
	return advisors;
}

这里从两个地方获取了增强器
1、配置文件中声明的增强器,通过super.findCandidateAdvisors方法来获取。
比如我们自定义了一个增强器,然后在配置文件中声明了。如下图:
自定义增强器
那么执行了findCandidateAdvisors方法后,就能获取到这个增强器。
下面我们来看看这个方法的获取逻辑。

public List<Advisor> findAdvisorBeans() {
   
	//从缓存中获取
	String[] advisorNames = this.cachedAdvisorBeanNames;
	//缓存中没有则走获取逻辑
	if (advisorNames == null) {
   
		//获取所有类型为Advisor的类的beanName
		advisorNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
				this.beanFactory, Advisor.class, true, false);
		//放入缓存
		this.cachedAdvisorBeanNames = advisorNames;
	}
	//没有获取到则返回空的集合
	if (advisorNames.length == 0) {
   
		return new ArrayList<>();
	}
	//获取到了则循环获取到的beanName
	List<Advisor> advisors = new ArrayList<>();
	for (String name : advisorNames) {
   
		//跳过不合法的bean,默认返回true,子类可以对规则进行定义
		if (isEligibleBean(name)) {
   
			//判断这个bean是否正在创建中
			if (this.beanFactory.isCurrentlyInCreation(name)) {
   
				if (logger.isTraceEnabled()) {
   
					logger.trace("Skipping currently created advisor '"<
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值