Spring AOP 基于注解源码整理

导入配置类

  1. EnableAspectJAutoProxy 注解导入 AspectJAutoProxyRegistrar

  2. ImportBeanDefinitionRegistrar#registerBeanDefinitions向容器中加入AnnotationAwareAspectJAutoProxyCreator

  3. AnnotationAwareAspectJAutoProxyCreator#initBeanFactory初始化ReflectiveAspectJAdvisorFactory

    text 复制代码
    protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
        super.initBeanFactory(beanFactory);
        if (this.aspectJAdvisorFactory == null) {
            this.aspectJAdvisorFactory = new ReflectiveAspectJAdvisorFactory(beanFactory);
        }
        this.aspectJAdvisorsBuilder =
                new BeanFactoryAspectJAdvisorsBuilderAdapter(beanFactory, this.aspectJAdvisorFactory);
    }

解析出所有的Advisor对象

  1. AbstractAutoProxyCreator#postProcessBeforeInstantiation

    text 复制代码
     public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
         Object cacheKey = getCacheKey(beanClass, beanName);
         if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) {
             if (this.advisedBeans.containsKey(cacheKey)) {
                 return null;
             }
             if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) {
                 this.advisedBeans.put(cacheKey, Boolean.FALSE);
                 return null;
             }
         }
         return null ;
     }
  2. AspectJAwareAdvisorAutoProxyCreator#shouldSkip

  3. AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors

  4. BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors

  5. 获取Spring容器中被Aspect注解的bean, 通过ReflectiveAspectJAdvisorFactory#getAdvisors获取Advisor

    text 复制代码
    MetadataAwareAspectInstanceFactory factory =
        new BeanFactoryAspectInstanceFactory(this.beanFactory, beanName);
    List<Advisor> classAdvisors = this.advisorFactory.getAdvisors(factory);
  6. ReflectiveAspectJAdvisorFactory#getAdvisors(factory)

    text 复制代码
    public List<Advisor> getAdvisors(MetadataAwareAspectInstanceFactory aspectInstanceFactory) {
        Class<?> aspectClass = aspectInstanceFactory.getAspectMetadata().getAspectClass();
        String aspectName = aspectInstanceFactory.getAspectMetadata().getAspectName();
        MetadataAwareAspectInstanceFactory lazySingletonAspectInstanceFactory =
                 new LazySingletonAspectInstanceFactoryDecorator(aspectInstanceFactory);
        List<Advisor> advisors = new ArrayList<>();
        for (Method method : getAdvisorMethods(aspectClass)) {
             Advisor advisor = getAdvisor(method, lazySingletonAspectInstanceFactory, 0, aspectName);
             if (advisor != null) {
                 advisors.add(advisor);
             }
        }
    }

生产代理对象

  1. AbstractAutoProxyCreator#postProcessAfterInitialization

    text 复制代码
     public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
         Object cacheKey = getCacheKey(bean.getClass(), beanName);
         if (this.earlyProxyReferences.remove(cacheKey) != bean) {
             return wrapIfNecessary(bean, beanName, cacheKey);
         }
         return bean;
     }
  2. AbstractAutoProxyCreator#wrapIfNecessary

    text 复制代码
    protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
         // Create proxy if we have advice.
         Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
         this.advisedBeans.put(cacheKey, Boolean.TRUE);
         Object proxy = createProxy(
             bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
         this.proxyTypes.put(cacheKey, proxy.getClass());
         return proxy;
    }
获取符合条件的Advisor集合
  1. AbstractAdvisorAutoProxyCreator#getAdvicesAndAdvisorsForBean

    text 复制代码
    protected Object[] getAdvicesAndAdvisorsForBean(
             Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) {
        List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName);
        if (advisors.isEmpty()) {
            return DO_NOT_PROXY;
        }
        return advisors.toArray();
    }
  2. AbstractAdvisorAutoProxyCreator#findEligibleAdvisors

    text 复制代码
    protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) {
         List<Advisor> candidateAdvisors = findCandidateAdvisors();
         List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);
         extendAdvisors(eligibleAdvisors);
         if (!eligibleAdvisors.isEmpty()) {
             eligibleAdvisors = sortAdvisors(eligibleAdvisors);
         }
         return eligibleAdvisors;
    }
  3. AbstractAdvisorAutoProxyCreator#findAdvisorsThatCanApply

    text 复制代码
    protected List<Advisor> findAdvisorsThatCanApply(
             List<Advisor> candidateAdvisors, Class<?> beanClass, String beanName) {
        ProxyCreationContext.setCurrentProxiedBeanName(beanName);
        try {
            return AopUtils.findAdvisorsThatCanApply(candidateAdvisors, beanClass);
        }finally {
            ProxyCreationContext.setCurrentProxiedBeanName(null);
        }
    }
创建代理对象
  1. AbstractAdvisorAutoProxyCreator#createProxy
相关推荐
weixin_440784111 小时前
【HandlerThread实现原理】
android·java·开发语言
leoZ2311 小时前
本地跑大模型实战(七):llama.cpp 性能调优,让推理更快更省
java·人工智能·spring·生成对抗网络·语言模型·自然语言处理·llama
有梦不弃1 小时前
模块化单体架构设计方案:DDD + 六边形架构落地实践
后端·架构
mubei-1233 小时前
SpringDAO的用法
java·开发语言·数据库
大模型momo3 小时前
Spring AI 实战:多 Agent 协作实战 —— 分工拆解复杂旅游行程任务
人工智能·spring·ai·agent·旅游
happymagic3 小时前
java spring boot做的jar包程序,如何实现自动运行启动
java·运维·服务器·spring boot·jar
都叫我大帅哥5 小时前
给 Java 程序员的 CSRF 攻击详解:从原理到防御实战
java
江南十四行6 小时前
Spring框架核心(上)——IoC控制反转与DI依赖注入详解
java·后端·spring
IT_陈寒6 小时前
Redis缓存击穿把我坑惨了,原来这样设过期时间才靠谱
前端·人工智能·后端
fb_123456 小时前
Linux磁盘分区从入门到实操:MBR_GPT全解析+分区工具实战指南
java·linux·gpt