欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

SpringAOP核心類有哪些

這篇文章主要講解了“Spring AOP核心類有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Spring AOP核心類有哪些”吧!

潢川網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,潢川網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為潢川上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的潢川做網(wǎng)站的公司定做!

類結(jié)構(gòu)圖

我們先來看下AnnotationAwareAspectJAutoProxyCreator類的結(jié)構(gòu)圖。

Spring AOP核心類有哪些  

上圖中一些 類/接口的介紹:

AspectJAwareAdvisorAutoProxyCreator: 公開了AspectJ的調(diào)用上下文,并弄清楚來自同一切面的多個(gè)Advisor在AspectJ中的優(yōu)先級(jí)規(guī)則。

AbstractAdvisorAutoProxyCreator: 通用自動(dòng)代理創(chuàng)建器,它基于檢測到的每個(gè)顧問程序?yàn)樘囟╞ean構(gòu)建AOP代理。

AbstractAutoProxyCreator: 擴(kuò)展了  ProxyProcessorSupport,實(shí)現(xiàn)了SmartInstantiationAwareBeanPostProcessor、BeanFactoryAware 接口,是BeanPostProcessor 實(shí)現(xiàn),該實(shí)現(xiàn)使用AOP代理包裝每個(gè)合格的bean,并在調(diào)用bean本身之前委派給指定的攔截器。

BeanFactoryAware: 實(shí)現(xiàn)了該接口的Bean可以知道它屬于那個(gè) BeanFactory,Bean可以通過Spring容器查找它的協(xié)同者(依賴查找),但大多數(shù)的Bean是通過構(gòu)造器參數(shù)和Bean方法(依賴注入)來獲取它的協(xié)同者。

BeanPostProcessor:工廠鉤子,允許自定義修改新的bean實(shí)例。例如,檢查標(biāo)記接口或使用代理包裝bean。如果我們需要在Spring容器中完成Bean的實(shí)例化,配置和其初始化前后添加一些自己的邏輯處理,我們就可以定義一個(gè)或多個(gè)BeanPostProcessor接口的實(shí)現(xiàn),然后注冊(cè)到容器中。

InstantiationAwareBeanPostProcessor: BeanPostProcessor  的子接口,它添加了實(shí)例化之前的回調(diào),以及實(shí)例化之后但設(shè)置了顯式屬性或自動(dòng)裝配之前的回調(diào)。它內(nèi)部提供了3個(gè)方法,再加上BeanPostProcessor接口內(nèi)部的2個(gè)方法,實(shí)現(xiàn)這個(gè)接口需要實(shí)現(xiàn)5個(gè)方法。InstantiationAwareBeanPostProcessor 接口的主要作用在于目標(biāo)對(duì)象的實(shí)例化過程中需要處理的事情,包括實(shí)例化對(duì)象的前后過程以及實(shí)例的屬性設(shè)置。

SmartInstantiationAwareBeanPostProcessor: InstantiationAwareBeanPostProcessor 接口的擴(kuò)展,多出了3個(gè)方法,添加了用于預(yù)測已處理bean的最終類型的回調(diào),再加上父接口的5個(gè)方法,所以實(shí)現(xiàn)這個(gè)接口需要實(shí)現(xiàn)8個(gè)方法,主要作用也是在于目標(biāo)對(duì)象的實(shí)例化過程中需要處理的事情。

總之:AspectJAwareAdvisorAutoProxyCreator為 AspectJ 切面類創(chuàng)建自動(dòng)代理。

 

核心類解析

BeanPostProcessor接口中的兩個(gè)方法 postProcessBeforeInitialization 和 postProcessAfterInitialization,作用是對(duì)Bean初始化前后添加一些自己的邏輯。

@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    return bean;
}

@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    return bean;
}
 

InstantiationAwareBeanPostProcessorBeanPostProcessor的子接口,它額外增加了3個(gè)新的方法:postProcessBeforeInstantiation( 目標(biāo)對(duì)象被實(shí)例化之前調(diào)用的方法,可以返回目標(biāo)實(shí)例的一個(gè)代理用來代替目標(biāo)實(shí)例 )、postProcessAfterInstantiation(該方法在Bean實(shí)例化之后執(zhí)行,返回false,會(huì)忽略屬性值的設(shè)置;如果返回true,會(huì)按照正常流程設(shè)置屬性值) 和 postProcessPropertyValues(對(duì)屬性值進(jìn)行修改,未來版本將會(huì)刪除)

@Nullable
default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
    return null;
}

default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
    return true;
}

@Nullable
default PropertyValues postProcessPropertyValues(
    PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
    return pvs;
}
 

SmartInstantiationAwareBeanPostProcessor接口繼承InstantiationAwareBeanPostProcessor接口,里面定義了3個(gè)方法:predictBeanType(預(yù)測Bean的類型)、determineCandidateConstructors(選擇合適的構(gòu)造器)、getEarlyBeanReference(解決循環(huán)引用問題)。

@Nullable
default Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {
    return null;
}

@Nullable
default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
    return null;
}

default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
    return bean;
}
 

AbstractAutoProxyCreator是AOP的一個(gè)核心類,它實(shí)現(xiàn)了SmartInstantiationAwareBeanPostProcessor、BeanFactoryAware 接口,實(shí)現(xiàn)了代理創(chuàng)建的邏輯,使用AOP代理包裝每個(gè)合格的bean,并在調(diào)用bean本身之前委派給指定的攔截器。

AbstractAdvisorAutoProxyCreator通用自動(dòng)代理創(chuàng)建器,它基于檢測每個(gè)bean的增強(qiáng)器,為特殊的bean構(gòu)建AOP代理。子類可以重寫此findCandidateAdvisors()方法,以返回適用于任何對(duì)象的advisor的自定義列表,子類還可以重寫繼承的AbstractAutoProxyCreator.shouldSkip()方法,以將某些對(duì)象排除在自動(dòng)代理之外。

protected List<Advisor> findCandidateAdvisors() {
       Assert.state(this.advisorRetrievalHelper != null, "No BeanFactoryAdvisorRetrievalHelper available");
     return this.advisorRetrievalHelper.findAdvisorBeans();
}
 

AspectJAwareAdvisorAutoProxyCreator擴(kuò)展 AbstractAdvisorAutoProxyCreator,公開了AspectJ的調(diào)用上下文,并在多個(gè)增強(qiáng)器來自同一切面時(shí)搞清楚AspectJ的建議優(yōu)先級(jí)順序。按AspectJ優(yōu)先級(jí)排序其余部分:

@Override
@SuppressWarnings("unchecked")
protected List<Advisor> sortAdvisors(List<Advisor> advisors) {
    List<PartiallyComparableAdvisorHolder> partiallyComparableAdvisors = new ArrayList<>(advisors.size());
    for (Advisor element : advisors) {
        partiallyComparableAdvisors.add(
            new PartiallyComparableAdvisorHolder(element, DEFAULT_PRECEDENCE_COMPARATOR));
    }
    List<PartiallyComparableAdvisorHolder> sorted = PartialOrder.sort(partiallyComparableAdvisors);
    if (sorted != null) {
        List<Advisor> result = new ArrayList<>(advisors.size());
        for (PartiallyComparableAdvisorHolder pcAdvisor : sorted) {
            result.add(pcAdvisor.getAdvisor());
        }
        return result;
    }
    else {
        return super.sortAdvisors(advisors);
    }
}
 

在增強(qiáng)鏈頭部增加一個(gè)ExposeInvocationInterceptor,使用AspectJ表達(dá)式切入點(diǎn)和使用AspectJ樣式的advisor時(shí),需要這些附加advisor。

protected void extendAdvisors(List<Advisor> candidateAdvisors) {
      AspectJProxyUtils.makeAdvisorChainAspectJCapableIfNecessary(candidateAdvisors);
}
 

如果此后處理器不應(yīng)該考慮將給定的bean用于自動(dòng)代理,子類應(yīng)重寫此方法以返回true

@Override
protected boolean shouldSkip(Class<?> beanClass, String beanName) {
    // TODO: Consider optimization by caching the list of the aspect names
    List<Advisor> candidateAdvisors = findCandidateAdvisors();
    for (Advisor advisor : candidateAdvisors) {
        if (advisor instanceof AspectJPointcutAdvisor &&
            ((AspectJPointcutAdvisor) advisor).getAspectName().equals(beanName)) {
            return true;
        }
    }
    return super.shouldSkip(beanClass, beanName);
}
 

AspectJAwareAdvisorAutoProxyCreator還有一個(gè)子類叫 AnnotationAwareAspectJAutoProxyCreator,子類AnnotationAwareAspectJAutoProxyCreator是用于處理當(dāng)前應(yīng)用程序上下文中的所有AspectJ注釋方面以及Spring Advisor。如果Spring  AOP的基于代理的模型能夠應(yīng)用任何AspectJ注釋的類,它們的advisor將被自動(dòng)識(shí)別,這涵蓋了方法執(zhí)行連接點(diǎn),Spring  Advisor的處理遵循AbstractAdvisorAutoProxyCreator中建立的規(guī)則。

 

生成代理對(duì)象

從使用aop:xxx標(biāo)簽來自動(dòng)生成代理的話,先看看AopNamespaceHandler,使用aop:config標(biāo)簽則使用 ConfigBeanDefinitionParser 解析,使用了aop:aspectj-autoproxy標(biāo)簽則使用 AspectJAutoProxyBeanDefinitionParser 解析,依次類推。

@Override
public void init() {
    // In 2.0 XSD as well as in 2.1 XSD.
    registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser());
    registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());
    registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator());

    // Only in 2.0 XSD: moved to context namespace as of 2.1
    registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
}
 
  • aop:config方式使用 AspectJAwareAdvisorAutoProxyCreator 創(chuàng)建代理
  • aop:aspectj-autoproxy使用 AnnotationAwareAspectJAutoProxyCreator 創(chuàng)建代理

ConfigBeanDefinitionParser.java

@Override
@Nullable
public BeanDefinition parse(Element element, ParserContext parserContext) {
    CompositeComponentDefinition compositeDef =
        new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element));
    parserContext.pushContainingComponent(compositeDef);

    configureAutoProxyCreator(parserContext, element); // 注冊(cè)AspectJAwareAdvisorAutoProxyCreator

    List<Element> childElts = DomUtils.getChildElements(element);
    for (Element elt: childElts) {
        String localName = parserContext.getDelegate().getLocalName(elt);
        if (POINTCUT.equals(localName)) {
            parsePointcut(elt, parserContext);
        }
        else if (ADVISOR.equals(localName)) {
            parseAdvisor(elt, parserContext);
        }
        else if (ASPECT.equals(localName)) {
            parseAspect(elt, parserContext);
        }
    }

    parserContext.popAndRegisterContainingComponent();
    return null;
}

private void configureAutoProxyCreator(ParserContext parserContext, Element element) {
    AopNamespaceUtils.registerAspectJAutoProxyCreatorIfNecessary(parserContext, element);
}
 

AopConfigUtils.java

@Override
@Nullable
public BeanDefinition parse(Element element, ParserContext parserContext) {
    CompositeComponentDefinition compositeDef =
        new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element));
    parserContext.pushContainingComponent(compositeDef);

    configureAutoProxyCreator(parserContext, element); // 注冊(cè)AspectJAwareAdvisorAutoProxyCreator

    List<Element> childElts = DomUtils.getChildElements(element);
    for (Element elt: childElts) {
        String localName = parserContext.getDelegate().getLocalName(elt);
        if (POINTCUT.equals(localName)) {
            parsePointcut(elt, parserContext);
        }
        else if (ADVISOR.equals(localName)) {
            parseAdvisor(elt, parserContext);
        }
        else if (ASPECT.equals(localName)) {
            parseAspect(elt, parserContext);
        }
    }

    parserContext.popAndRegisterContainingComponent();
    return null;
}

private void configureAutoProxyCreator(ParserContext parserContext, Element element) {
    AopNamespaceUtils.registerAspectJAutoProxyCreatorIfNecessary(parserContext, element);
}
 

AopConfigUtils.java

public static void registerAspectJAutoProxyCreatorIfNecessary(
    ParserContext parserContext, Element sourceElement) {
    // 在這里注冊(cè)的是AspectJAwareAdvisorAutoProxyCreator
    BeanDefinition beanDefinition = AopConfigUtils.registerAspectJAutoProxyCreatorIfNecessary(
        parserContext.getRegistry(), parserContext.extractSource(sourceElement));
    useClassProxyingIfNecessary(parserContext.getRegistry(), sourceElement);
    registerComponentIfNecessary(beanDefinition, parserContext); // 注冊(cè)組件
}
 
@Nullable
public static BeanDefinition registerAspectJAutoProxyCreatorIfNecessary(
    BeanDefinitionRegistry registry, @Nullable Object source) {

    return registerOrEscalateApcAsRequired(AspectJAwareAdvisorAutoProxyCreator.class, registry, source);
}
 

AspectJAwareAdvisorAutoProxyCreator實(shí)現(xiàn)了 BeanPostProcessor等上面介紹的接口,主要作用于Bean初始化前后,實(shí)例化前后,所有的Bean都被作用到。InstantiationAwareBeanPostProcessorBeanPostProcessor的子接口,但它的調(diào)用時(shí)間點(diǎn)發(fā)生在Bean實(shí)例化前,在真正調(diào)用doCreateBean()創(chuàng)建bean實(shí)例之前執(zhí)行postProcessBeforeInstantiation()。

AbstractAutoProxyCreator.java

@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
    Object cacheKey = getCacheKey(beanClass, beanName);  // 得到一個(gè)緩存的唯一key(根據(jù)beanClass和beanName生成唯一key)
    // 如果當(dāng)前targetSourcedBeans(通過自定義TargetSourceCreator創(chuàng)建的TargetSource)不包含cacheKey
    if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) {
        if (this.advisedBeans.containsKey(cacheKey)) {  //advisedBeans(已經(jīng)被增強(qiáng)的Bean,即AOP代理對(duì)象)中包含當(dāng)前cacheKey,返回null,即走Spring默認(rèn)流程
            return null;
        }
        if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) {// 如果是基礎(chǔ)設(shè)施類(如Advisor、Advice、AopInfrastructureBean的實(shí)現(xiàn))不進(jìn)行處理;(略)
            this.advisedBeans.put(cacheKey, Boolean.FALSE);
            return null;
        }
    }

    // 如果有自定義的TargetSource,在此處創(chuàng)建代理
    // 禁止目標(biāo)Bean的不必要的默認(rèn)實(shí)例化:
    // TargetSource將以自定義方式處理目標(biāo)實(shí)例。
    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;
}
 

通過 AbstractAutoProxyCreator 中的 postProcessAfterInitialization() 創(chuàng)建AOP代理。

@Override
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) throws BeansException {
    if (bean != null) {
        Object cacheKey = getCacheKey(bean.getClass(), beanName);
        if (!this.earlyProxyReferences.contains(cacheKey)) {  // 如果之前調(diào)用過getEarlyBeanReference獲取包裝目標(biāo)對(duì)象到AOP代理對(duì)象(如果需要),則不再執(zhí)行
            return wrapIfNecessary(bean, beanName, cacheKey);  // 包裝目標(biāo)對(duì)象到AOP代理對(duì)象(如果需要)
        }
    }
    return bean;
}

protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
    if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) { // 通過TargetSourceCreator進(jìn)行自定義TargetSource不需要包裝
        return bean;
    }
    if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {  // 不應(yīng)該被增強(qiáng)對(duì)象不需要包裝
        return bean;
    }
    if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) { // 基礎(chǔ)設(shè)施或應(yīng)該skip的不需要保證
        this.advisedBeans.put(cacheKey, Boolean.FALSE);
        return bean;
    }

    // 如果有advise則創(chuàng)建代理。
    Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
    if (specificInterceptors != DO_NOT_PROXY) {
        this.advisedBeans.put(cacheKey, Boolean.TRUE);
        Object proxy = createProxy(
            bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean)); // 創(chuàng)建代理對(duì)象
        this.proxyTypes.put(cacheKey, proxy.getClass());
        return proxy;
    }

    this.advisedBeans.put(cacheKey, Boolean.FALSE);
    return bean;
}

感謝各位的閱讀,以上就是“Spring AOP核心類有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Spring AOP核心類有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站名稱:SpringAOP核心類有哪些
網(wǎng)站路徑:http://aaarwkj.com/article42/iihihc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)軟件開發(fā)、App設(shè)計(jì)、企業(yè)建站、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
日韩免费av在线网站| 禁区正片免费看完整国产| 99精品国产一区二区青青性色 | 人妻少妇被猛烈进入文字幕| 久久久久久久精品久久| 大胆丰满邻居少妇在线观看| 最近中文字幕免费手机版| 日韩不卡在线观看免费| 欧美香蕉在线观看视频| 在线观看91精品国产秒播| 国产精品深夜在线观看| 91桃色午夜福利视频| 99久久精品国产熟女| 后入式动漫在线观看| 日日添夜夜躁欧美一区二区| 丰满少妇一区二区自拍区| 人妻少妇偷人精品免费看| 亚洲国产一区二区三区三州| av福利一区二区三区| 91高清国产最新地址| 亚洲免费视频一二三区| 免费日韩黄片在线观看| 日韩在线一区中文字幕| 日韩av黄色制服在线网站| 亚洲成人久久久av一区| 亚洲欧美日韩在线第三页| 成人日韩av免费在线观看| 亚洲欧美日韩一区91| 亚洲一区免费在线视频| 激情五月婷婷久久av| 亚洲国产欧美日韩在线一区| 好看的中文字幕人妻少妇| 高清av中文免费在线| 久久精品久久久精品| 亚洲av日韩精品久久久| 精品熟女少妇av免费观看| 91福利免费在线看| 色噜噜人妻av中文字幕| 国产亚洲中文字幕91| 中文乱幕亚洲无套内射| 我要看国产一级内射片|