欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring源码解析---AOP

程序员文章站 2022-07-12 14:58:42
...

动态AOP自定义标签

Spring源码解析---AOP

    private static BeanDefinition registerOrEscalateApcAsRequired(Class<?> cls, BeanDefinitionRegistry registry, Object source) {
        Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
        if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME)) {
            BeanDefinition apcDefinition = registry.getBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME);
            if (!cls.getName().equals(apcDefinition.getBeanClassName())) {
                int currentPriority = findPriorityForClass(apcDefinition.getBeanClassName());
                int requiredPriority = findPriorityForClass(cls);
                if (currentPriority < requiredPriority) {
                    apcDefinition.setBeanClassName(cls.getName());
                }
            }
            return null;
        }
        RootBeanDefinition beanDefinition = new RootBeanDefinition(cls);
        beanDefinition.setSource(source);
        beanDefinition.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE);
        beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
        registry.registerBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME, beanDefinition);//注册BeanDefinition
        return beanDefinition;
    }

代理对象生成的过程

AbstractAutoProxyCreator是一种InstantiationAwareBeanPostProcessor,其url图如下,其有效的方法是:postProcessBeforeInstantiation,postProcessAfterInitialization。

Spring源码解析---AOP

代理对象生成过程的时序图如下:

Spring源码解析---AOP

代理对象调用的过程

以JdkDynamicAopProxy为例:

Spring源码解析---AOP

以下博客写得很好:
https://my.oschina.net/u/2377110/blog/1507532

相关标签: aop 标签 spring