最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Spring的AnnotationAwareAspectJAutoProxyCreator類解析

 更新時間:2023年05月11日 10:37:30   作者:冰 河  
這篇文章主要介紹了關(guān)于Spring的AnnotationAwareAspectJAutoProxyCreator類解析,Spring是一個開源免費的框架 , 容器,是一個輕量級的框架 ,需要的朋友可以參考下

通過查看@EnableAspectJAutoProxy 注解的源碼,如下所示。

package org.springframework.context.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
 boolean proxyTargetClass() default false;
 boolean exposeProxy() default false;
}

得知,@EnableAspectJAutoProxy注解是通過使用@Import(AspectJAutoProxyRegistrar.class) 給容器中注冊一個名字叫做internalAutoProxyCreator = AnnotationAwareAspectJAutoProxyCreator的組件。

并且我們也分析了AnnotationAwareAspectJAutoProxyCreato類的核心繼承關(guān)系,如下所示。

  AnnotationAwareAspectJAutoProxyCreator
       --AspectJAwareAdvisorAutoProxyCreator
         --AbstractAdvisorAutoProxyCreator
           --AbstractAutoProxyCreator
             -- ProxyProcessorSupport, SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware

查看繼承關(guān)系可以發(fā)現(xiàn),此類實現(xiàn)了AwareBeanPostProcessor接口,這兩個接口都和Spring bean的初始化有關(guān),由此推測此類主要處理方法都來自這兩個接口的實現(xiàn)方法。同時該類也實現(xiàn)了order方法。

那今天,我們就來看看AnnotationAwareAspectJAutoProxyCreator 類的調(diào)用流程,具體來說,就是看看 ``AnnotationAwareAspectJAutoProxyCreator` 作為BeanPostProcessor做了哪些工作,作為BeanFactoryAware做了哪些工作。

分析AbstractAutoProxyCreator類

AnnotationAwareAspectJAutoProxyCreator類的繼承關(guān)系上可以看出, 是在AbstractAutoProxyCreator類開始實現(xiàn) SmartInstantiationAwareBeanPostProcessor接口和 BeanFactoryAware 接口的。

所以,我們先來看看 AbstractAutoProxyCreator 類進行分析。

AbstractAutoProxyCreator 類的定義我們可以看出,AbstractAutoProxyCreator類直接實現(xiàn)了SmartInstantiationAwareBeanPostProcessor 接口和 BeanFactoryAware 接口。

public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
		implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {

既然 AbstractAutoProxyCreator 實現(xiàn)了 BeanFactoryAware 接口, 那么 AbstractAutoProxyCreator 類中就一定存在setBeanFactory()方法,如下所示。

@Override
public void setBeanFactory(BeanFactory beanFactory) {
    this.beanFactory = beanFactory;
}
@Nullable
protected BeanFactory getBeanFactory() {
    return this.beanFactory;
}

果然,我們在 AbstractAutoProxyCreator 類中找到了setBeanFactory()方法和getBeanFactory()方法。

另外,在 AbstractAutoProxyCreator 類中還存在與BeanPostProcessor后置處理器有關(guān)的方法,分別為:postProcessBeforeInstantiation()、postProcessAfterInstantiation()、postProcessProperties()、postProcessBeforeInitialization()、postProcessAfterInitialization()。整體源代碼如下所示。

@Override
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;
        }
    }
    TargetSource targetSource = getCustomTargetSource(beanClass, beanName);
    if (targetSource != null) {
        if (StringUtils.hasLength(beanName)) {
            this.targetSourcedBeans.add(beanName);
        }
        Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);
        Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource);
        this.proxyTypes.put(cacheKey, proxy.getClass());
        return proxy;
    }
    return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) {
    return true;
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
    return pvs;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
    return bean;
}
@Override
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
    if (bean != null) {
        Object cacheKey = getCacheKey(bean.getClass(), beanName);
        if (this.earlyProxyReferences.remove(cacheKey) != bean) {
            return wrapIfNecessary(bean, beanName, cacheKey);
        }
    }
    return bean;
}

也就是說,在AbstractAutoProxyCreator 類中,存在后置處理器的邏輯。

到這,我們就在AbstractAutoProxyCreator 類中看到了BeanFactoryAware 的實現(xiàn)和后置處理器的實現(xiàn)。

接下來,我們再來看看AbstractAutoProxyCreator 的子類 AbstractAdvisorAutoProxyCreator類。

分析AbstractAdvisorAutoProxyCreator類

AbstractAdvisorAutoProxyCreator類中,我們會看到如下代碼。

@Override
public void setBeanFactory(BeanFactory beanFactory) {
    super.setBeanFactory(beanFactory);
    if (!(beanFactory instanceof ConfigurableListableBeanFactory)) {
        throw new IllegalArgumentException(
            "AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory);
    }
    initBeanFactory((ConfigurableListableBeanFactory) beanFactory);
}

說明在AbstractAdvisorAutoProxyCreator類中重寫了setBeanFactory()方法。并且在AbstractAdvisorAutoProxyCreator類的setBeanFactory()方法中,首先會調(diào)用AbstractAutoProxyCreator 類中的setBeanFactory()方法。

在setBeanFactory()方法中會調(diào)用initBeanFactory()方法,initBeanFactory()方法的實現(xiàn)如下所示。

protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    this.advisorRetrievalHelper = new BeanFactoryAdvisorRetrievalHelperAdapter(beanFactory);
}

initBeanFactory()方法的實現(xiàn)比較簡單,這里,我就不多說了。

另外,我們并沒有在AbstractAdvisorAutoProxyCreator類中找到與后置處理器相關(guān)的方法。

接下來,我們繼續(xù)分析AbstractAdvisorAutoProxyCreator類的子類AspectJAwareAdvisorAutoProxyCreator類。

分析AspectJAwareAdvisorAutoProxyCreator類

通過查看AspectJAwareAdvisorAutoProxyCreator類的源碼,我們得知,在 AspectJAwareAdvisorAutoProxyCreator類中沒有與后置處理器相關(guān)的代碼。所以,我們繼續(xù)向上分析 AspectJAwareAdvisorAutoProxyCreator類的子類 AnnotationAwareAspectJAutoProxyCreator。

分析AnnotationAwareAspectJAutoProxyCreator類

AnnotationAwareAspectJAutoProxyCreator類中,我們可以找到一個initBeanFactory()方法,如下所示。

@Override
protected void initBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    super.initBeanFactory(beanFactory);
    if (this.aspectJAdvisorFactory == null) {
        this.aspectJAdvisorFactory = new ReflectiveAspectJAdvisorFactory(beanFactory);
    }
    this.aspectJAdvisorsBuilder =
        new BeanFactoryAspectJAdvisorsBuilderAdapter(beanFactory, this.aspectJAdvisorFactory);
}

看到這里,小伙伴們對于setBeanFactory的調(diào)用流程有點清晰了吧?其實setBeanFactory()的調(diào)用流程為:首先會執(zhí)行 AbstractAdvisorAutoProxyCreator類中的setBeanFactory()方法,在AbstractAdvisorAutoProxyCreator類中的setBeanFactory()方法中會調(diào)用其父類AbstractAutoProxyCreator 中的setBeanFactory()方法,然后在AbstractAdvisorAutoProxyCreator類中的setBeanFactory()方法中調(diào)用initBeanFactory()方法。由于在子類AnnotationAwareAspectJAutoProxyCreator中重寫了initBeanFactory()方法,最終調(diào)用的就是AnnotationAwareAspectJAutoProxyCreator類中的initBeanFactory()方法。這么說有點繞,我們來看一張圖吧。

在這里插入圖片描述

注意,上圖中的AbstractAdvisorAutoProxyCreator類中的setBeanFactory()方法作為程序調(diào)用的入口,它會依次調(diào)用AbstractAutoProxyCreator#setBeanFactory()AnnotationAwareAspectJAutoProxyCreator#initBeanFactory() ,然后,再由 AnnotationAwareAspectJAutoProxyCreator#initBeanFactory() 調(diào)用 AbstractAdvisorAutoProxyCreator#initBeanFactory()

除此之外,我們在AnnotationAwareAspectJAutoProxyCreator類中,并沒有發(fā)現(xiàn)與后置處理器相關(guān)的代碼了。

好了,以上就是我們分析的有關(guān)AnnotationAwareAspectJAutoProxyCreator類的源碼。在下一篇文章中,我們開始debug調(diào)試這些源代碼的具體執(zhí)行流程。

到此這篇關(guān)于關(guān)于Spring的AnnotationAwareAspectJAutoProxyCreator類解析的文章就介紹到這了,更多相關(guān)Spring的AnnotationAwareAspectJAutoProxyCreator類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 史上最全的java隨機數(shù)生成算法分享

    史上最全的java隨機數(shù)生成算法分享

    這篇文章主要介紹了史上最全的java隨機數(shù)生成算法,我分享一個最全的隨機數(shù)的生成算法,最代碼的找回密碼的隨機數(shù)就是用的這個方法
    2014-01-01
  • JAVA之反射機制Reflection的使用

    JAVA之反射機制Reflection的使用

    這篇文章主要介紹了JAVA之反射機制Reflection的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Spring Task 動態(tài)修改任務執(zhí)行計劃cron方式

    Spring Task 動態(tài)修改任務執(zhí)行計劃cron方式

    這篇文章主要介紹了Spring Task 動態(tài)修改任務執(zhí)行計劃cron方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java多態(tài)和實現(xiàn)接口的類的對象賦值給接口引用的方法(推薦)

    Java多態(tài)和實現(xiàn)接口的類的對象賦值給接口引用的方法(推薦)

    下面小編就為大家?guī)硪黄狫ava多態(tài)和實現(xiàn)接口的類的對象賦值給接口引用的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • IDEA的基本使用(讓你的IDEA有飛一般的感覺)

    IDEA的基本使用(讓你的IDEA有飛一般的感覺)

    這篇文章主要介紹了IDEA的基本使用(讓你的IDEA有飛一般的感覺),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Java中具有映射關(guān)系的容器:數(shù)組和Map的區(qū)別說明

    Java中具有映射關(guān)系的容器:數(shù)組和Map的區(qū)別說明

    這篇文章主要介紹了Java中具有映射關(guān)系的容器:數(shù)組和Map的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • SpringBoot全局異常處理之解決404/500錯誤

    SpringBoot全局異常處理之解決404/500錯誤

    在搭建項目框架的時候用的是springboot,想統(tǒng)一處理異常,但是發(fā)現(xiàn)404的錯誤總是捕捉不到,總是返回的是springBoot自帶的錯誤結(jié)果信息,這篇文章主要給大家介紹了關(guān)于SpringBoot全局異常處理之解決404/500錯誤的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • Java中獲取時間戳的三種方式對比實現(xiàn)

    Java中獲取時間戳的三種方式對比實現(xiàn)

    這篇文章主要介紹了Java中獲取時間戳的三種方式對比實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • spring基礎概念AOP與動態(tài)代理理解

    spring基礎概念AOP與動態(tài)代理理解

    這篇文章主要為大家詳細介紹了spring基礎概念AOP與動態(tài)代理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • SpringBoot使用Sa-Token實現(xiàn)權(quán)限認證

    SpringBoot使用Sa-Token實現(xiàn)權(quán)限認證

    本文主要介紹了SpringBoot使用Sa-Token實現(xiàn)權(quán)限認證,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04

最新評論

冀州市| 商城县| 柳州市| 城固县| 和政县| 安顺市| 商洛市| 囊谦县| 贵定县| 大英县| 孟州市| 建水县| 理塘县| 景德镇市| 永川市| 临漳县| 吴堡县| 年辖:市辖区| 临江市| 中超| 桂东县| 延津县| 仙居县| 类乌齐县| 海安县| 茌平县| 台前县| 阜宁县| 常宁市| 潮州市| 临朐县| 饶河县| 朔州市| 绥德县| 兰溪市| 林芝县| 南郑县| 博罗县| 宝应县| 元朗区| 临汾市|