のAbstractAdvisorAutoProxyCreator Springbootソースコード解析

要約:

Spring上層のエージェントがに分割されているProxyCreatorSupportProxyProcessorSupport前者はポストプロセッサに基づいているプロキシファクトリ、に基づいており、その自動ポスト剤とみなすことができます。ときにspringコンテナがする必要がaop織り込まれbean、より多くの時間、簡単に使用していますProxyFacotryBean間違いなく(各ので、ワークロードの多くを追加しますBean!取扱説明書を書かなければなりませんでした)。だから、自動プロキシはにおけるその役割を果たします。

ファイル

春は自動的にプロキシカテゴリを作成します

インテリアでは、春は使用BeanPostProcessorプロキシの自動生成を行うこと。ルールのいくつかの実施例による容器のBeanPostProcessor自動プロキシクリエータのクラスベースの実装Beanビーン整合剤インスタンスの生成。プロキシの作成者は、次の3つのカテゴリに分けることができます。

  • 豆自動プロキシ設定名はルールに基づいて生成された:クラスが実装され、自動作成者が特定の構成グループBean名のプロキシエージェントのインスタンスを作成することができBeanNameAutoProxyCreator
  • 基づいて、Advisorすべてのコンテナが自動的にマッチング豆に適用切断一致プロキシ機構を作成自動的にスキャンされ、その上にアドバイザ、実装クラスであるDefaultAdvisorAutoProxyCreator(それはまたプレフィックスマッチングをサポートしています)
  • ビーンに基づいてAspectJ自動プロキシジェネレータを注釈付き:豆は、AspectJのアノテーションは、自動プロキシインスタンスを含むカット作成、実装クラスがありAnnotationAwareAspectJAutoProxyCreator、それは私たちです@EnableAspectJAutoProxy〜私たちの現在最も広く使用されている方法である、インポート

BeanNameAutoProxyCreator

    package com.github.dqqzj.springboot.aop;
    
    import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    
    /**
     * @author qinzhongjian
     * @date created in 2019-08-25 09:43
     * @description: TODO
     * @since JDK 1.8.0_212-b10
     */
    @Component
    public class MyBeanNameAutoProxyCreator extends BeanNameAutoProxyCreator {
        @PostConstruct
        public void init() {
            super.setBeanNames("aopService", "abstractAutoProxyCreatorService");
            super.setInterceptorNames("myMethodBeforeAdvice");
        }
    
    }

ファイル

あなたは彼らの登録を使用する場合@Beanの代わり@EnableAspectJAutoProxyに自動的にあなたの創造者を登録するには、デフォルトをAnnotationAwareAspectJAutoProxyCreator次のように、あなたはビーンビーン名にサインアップすることができます。

    // 手动注册一个自动代理创建器,且名字务必叫AopConfigUtils.AUTO_PROXY_CREATOR_BEAN_NAME
    @Bean(AopConfigUtils.AUTO_PROXY_CREATOR_BEAN_NAME) 
    public BeanNameAutoProxyCreator beanNameAutoProxyCreator() {
        ...
    }

AbstractAutoProxyCreator

    public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
            implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
            ...
    }

AbstractAutoProxyCreatorこれは、自動プロキシクリエータの抽象的実現です。最も重要なのは、それが実装SmartInstantiationAwareBeanPostProcessorインタフェースは、に関与することになりSpring IoC、コンテナのBeanインスタンス化プロセス、AbstractAutowireCapableBeanFactoryこのようなコードの一部があります

    try {
                // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
                Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
                if (bean != null) {
                    return bean;
                }
            }

これはので、しかし、一般的には、有効になりませんresolveBeforeInstantiation唯一の自己定義のためにあるtargetsourceカスタムので、targetsource豆の春は、初期の一連の例に従う必要はありませんので、確認されていません。それはresolveBeforeInstantiationで直接行うことができますproxyシンプルまあ、このコードは、開発者が、一般的に以下を使用し、無視することができます。

resolveBeforeInstantiationが直接Beanを返すようにする方法?

    package com.github.dqqzj.springboot.aop;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;
    
    /**
     * @author qinzhongjian
     * @date created in 2019-08-25 11:35
     * @description: TODO
     * @since JDK 1.8.0_212-b10
     */
    public class AopServiceInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
        @Override
        public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
            if (beanClass.isInstance(AopService.class)) {
                return new AopService();
            }
            return null;
        }
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    }

ファイル

これは、springそう直接返した場合、ポストプロセッサは、等価のうち初めてIOC、同じ依存性注入のライフサイクル、充填及び処理されていない他の特性、使用する際に留意しなければなりませんよりよいこの機能を使用しません。

フォローアップでBeanを初期化する過程では2特に重要な後処理工程があり、非同期依存のサイクルとさえ注釈の影響と物事が多かれ少なかれを持っているノート、フォローアップは、それらを分析していきます。

要約:

SpringAOP自分の作成するために避けるべきでAutoProxyCreator、内部のメカニズムを、問題はほとんど上記のコンテンツを共有しないと考えられていないので、私は、この最も重要な建築家、様々なサブクラスに精通感じるので、その複雑さは必然的に、他の異常な問題が発生します非常に異なる実現していますが、心に留めておきたいか、それに精通しているすべては現実的ではありませんが、問題を満たすために彼のデザインを持つ唯一の馴染みが簡単にターンソースを解決することができます。

おすすめ

転載: www.cnblogs.com/qinzj/p/11407493.html