获取增强器
获取增强器的方法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 '" + name +