要約:
Spring
上層のエージェントがに分割されているProxyCreatorSupport
とProxyProcessorSupport
前者はポストプロセッサに基づいているプロキシファクトリ、に基づいており、その自動ポスト剤とみなすことができます。ときに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
、内部のメカニズムを、問題はほとんど上記のコンテンツを共有しないと考えられていないので、私は、この最も重要な建築家、様々なサブクラスに精通感じるので、その複雑さは必然的に、他の異常な問題が発生します非常に異なる実現していますが、心に留めておきたいか、それに精通しているすべては現実的ではありませんが、問題を満たすために彼のデザインを持つ唯一の馴染みが簡単にターンソースを解決することができます。