首页 > 编程语言 >【Spring AOP】【五】Spring AOP源码解析-筛选编排合适的通知器

【Spring AOP】【五】Spring AOP源码解析-筛选编排合适的通知器

时间:2023-02-20 08:11:26浏览次数:71  
标签:eligibleAdvisors Spring beanName List 源码 AOP 筛选 beanClass

1  前言

我们了解过AOP配置解析以及AOP的切入时机,那么这篇我们看看,AOP是如何给某个Bean筛选合适的通知器。

2  源码分析

2.1  方法通读

我们从AOP切入时机中,为当前bean筛选通知器开始继续看起:

protected Object[] getAdvicesAndAdvisorsForBean(
        Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) {
    // 为当前的bean筛选合适的通知器
    List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName);
    // 如果集合为空表示不需要代理
    if (advisors.isEmpty()) {
        return DO_NOT_PROXY;
    }
    return advisors.toArray();
}

protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) {
    // 获取所有的通知器
    List<Advisor> candidateAdvisors = findCandidateAdvisors();
    // 筛选哪些是可以作用到当前bean的
    // 通过 ClassFilter 和 MethodMatcher 对目标类和方法进行匹配
    List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);
    // 扩展操作
    extendAdvisors(eligibleAdvisors);
    if (!eligibleAdvisors.isEmpty()) {
        // 通知器排序根据order
        eligibleAdvisors = sortAdvisors(eligibleAdvisors);
    }
    return eligibleAdvisors;
}

2.2  findAdvisorsThatCanApply

(1)派小弟AopUtils来筛选,我们继续往里走

protected List<Advisor> findAdvisorsThatCanApply(
        List<Advisor> candidateAdvisors, Class<?> beanClass, String beanName) {
    ProxyCreationContext.setCurrentProxiedBeanName(beanName);
    try {
        // 派AopUtils来进行筛选
        return AopUtils.findAdvisorsThatCanApply(candidateAdvisors, beanClass);
    }
    finally {
        ProxyCreationContext.setCurrentProxiedBeanName(null);
    }
}

(2)

标签:eligibleAdvisors,Spring,beanName,List,源码,AOP,筛选,beanClass
From: https://www.cnblogs.com/kukuxjx/p/17136109.html

相关文章

  • 【Spring AOP】【三】Spring AOP源码解析-注解方式加载解析过程
    1 前言上一篇我们讲解了XML方式解析AOP的配置,这篇我们来解析下注解方式的解析过程。2 代码准备@Component@AspectpublicclassMyAspect{@Pointcut("exec......
  • spring,自定义注解,工厂模式,策略模式优化 if else,jdk1.7
    最近项目中使用mqtt监听消息,再根据消息做各种处理,使用大量的ifelse,代码异常难维护,参考的地址找不到了。。。 以下为实现:接收mqtt的接口类packagecom.mhm.mqttlistener;im......
  • Springcloud环境中bootstrap.yml加载原理
    如果是Springcloud项目,一般会将配置中心、注册中心等地址存入bootstrap.yml中,同时将其他的配置存入配置中心。也就是说bootstrap.yml的读取会比较靠前。下面研究其机......
  • 【Spring AOP】【一】Spring AOP源码解析文章导读
    1 前言IOC的一些东西我们说过了,这篇我们开始看看AOP,面向切面编程,他也是Spring的一个核心功能,他的作用就是给我们的Bean创建代理对象,进行功能增强,比如我们的事务、日志等......
  • SpringBoot文件上传
    文件上传引入依赖<!--文件上传--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifact......
  • 【Spring AOP】【二】Spring AOP源码解析-XML方式加载解析过程
    1 前言这篇我们看一下,我们的AOP代码是怎么被Spring加载的进去的,那么分两种一种是XML配置的,一种就是我们常用的注解,我们从源码先看下XML方式的都是怎么被加载解析的。2......
  • Spring-IOC、AOP、事务的说明
    今天来聊一聊我对spring框架的认识,本篇章中不详细讲解具体的使用方法和实现一、spring是什么?spring是一个java语言下的bean管理的基础框架。二、spring的常用功能有那......
  • SpringBoot升级到3.0
    SpringBoot3.0出来有一段时间了,一直没时间来整理,这次来看一下吧。SpringBoot可以轻松创建独立的、生产级的基于Spring的应用程序,您可以“直接运行”。1.SpringBoo......
  • springboot mybatis (关联关系:一对一,一对多,多对多)
    例如这个学生选课的这个:这个里面课程跟老师是1对1的,而老师对课程是1对多的,一个课程只能由一个老师教,而一个老师可以教多个课程对于学生和课程之间是多对多的,一个学生可以......
  • mapper-spring-boot-starter的使用
    <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:s......