public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
BeanPostProcessor
実装。 このクラスは、作成するすべてのプロキシで共有される「共通」インターセプターと、Bean インスタンスごとに一意の「特定」インターセプターを区別します。共通インターセプターは不要です。存在する場合は、interceptorNames プロパティを使用して設定されます。ProxyFactoryBean
と同様に、プロトタイプアドバイザーとインターセプターを正しく処理できるように、Bean 参照ではなく、現在のファクトリ内のインターセプター名が使用されます。たとえば、ステートフルミックスインをサポートする場合などです。"interceptorNames"
エントリでは、すべてのアドバイス型がサポートされます。
このような自動プロキシは、同じプロキシでラップする必要がある Bean が多数ある場合、つまり同じインターセプターに委譲する場合に特に役立ちます。x ターゲット Bean の x 反復プロキシ定義の代わりに、そのようなポストプロセッサーを Bean ファクトリに 1 つ登録して、同じ効果を実現できます。
サブクラスは任意の戦略を適用して、Bean をプロキシするかどうかを決定できます。型、名前、定義の詳細など。特定の Bean インスタンスに適用するだけの追加インターセプターを返すこともできます。簡単で具体的な実装は BeanNameAutoProxyCreator
で、指定された名前を介してプロキシされる Bean を識別します。
任意の数の TargetSourceCreator
実装を使用して、カスタムターゲットソースを作成できます。たとえば、プロトタイプオブジェクトをプールします。TargetSourceCreator がカスタム TargetSource
を指定している限り、アドバイスがなくても自動プロキシは発生します。TargetSourceCreators セットがない場合、または一致するものがない場合、デフォルトで SingletonTargetSource
がターゲット Bean インスタンスをラップするために使用されます。
setInterceptorNames(java.lang.String...)
, getAdvicesAndAdvisorsForBean(java.lang.Class<?>, java.lang.String, org.springframework.aop.TargetSource)
, BeanNameAutoProxyCreator
, DefaultAdvisorAutoProxyCreator
, 直列化された形式 修飾子と型 | フィールドと説明 |
---|---|
protected static ObjectSE[] | DO_NOT_PROXY サブクラスの便利な定数: 「プロキシしない」の戻り値。 |
protected Log | logger サブクラスで利用可能なロガー。 |
protected static ObjectSE[] | PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS サブクラスの便利な定数: 「追加のインターセプターなしのプロキシ、一般的なインターセプターのみ」の戻り値。 |
HIGHEST_PRECEDENCE, LOWEST_PRECEDENCE
コンストラクターと説明 |
---|
AbstractAutoProxyCreator() |
修飾子と型 | メソッドと説明 |
---|---|
protected boolean | advisorsPreFiltered() サブクラスによって返されたアドバイザが、Bean のターゲットクラスに一致するように事前にフィルタリングされているかどうかを返します。これにより、AOP 呼び出しのアドバイザチェーンを構築するときに ClassFilter チェックをスキップできます。 |
protected Advisor[] | buildAdvisors(StringSE beanName, ObjectSE[] specificInterceptors) 特定のインターセプターと共通インターセプターを含む、指定された Bean のアドバイザーを決定します。これらはすべてアドバイザーインターフェースに適合しています。 |
protected ObjectSE | createProxy(ClassSE<?> beanClass, StringSE beanName, ObjectSE[] specificInterceptors, TargetSource targetSource) 指定された Bean の AOP プロキシを作成します。 |
protected void | customizeProxyFactory(ProxyFactory proxyFactory) サブクラスは、これを実装することを選択できます。たとえば、公開されているインターフェースを変更するためです。 |
ConstructorSE<?>[] | determineCandidateConstructors(ClassSE<?> beanClass, StringSE beanName) 指定された Bean に使用する候補コンストラクターを決定します。 |
protected abstract ObjectSE[] | getAdvicesAndAdvisorsForBean(ClassSE<?> beanClass, StringSE beanName, TargetSource customTargetSource) 指定された Bean をプロキシするかどうか、どのような追加のアドバイスを返すか(例: |
protected BeanFactory | getBeanFactory() 所有する BeanFactory を返します。 |
protected ObjectSE | getCacheKey(ClassSE<?> beanClass, StringSE beanName) 指定された Bean クラスと Bean 名のキャッシュキーを作成します。 |
protected TargetSource | getCustomTargetSource(ClassSE<?> beanClass, StringSE beanName) Bean インスタンスのターゲットソースを作成します。 |
ObjectSE | getEarlyBeanReference(ObjectSE bean, StringSE beanName) 通常、循環参照を解決するために、指定された Bean に早期にアクセスするための参照を取得します。 |
boolean | isFrozen() 構成が凍結されているかどうかを返します。アドバイスを変更することはできません。 |
protected boolean | isInfrastructureClass(ClassSE<?> beanClass) 指定された Bean クラスが、決してプロキシされるべきではないインフラストラクチャクラスを表すかどうかを返します。 |
ObjectSE | postProcessAfterInitialization(ObjectSE bean, StringSE beanName) Bean がサブクラスによってプロキシするものとして識別される場合、設定されたインターセプターでプロキシを作成します。 |
boolean | postProcessAfterInstantiation(ObjectSE bean, StringSE beanName) コンストラクターまたはファクトリメソッドを介して Bean がインスタンス化された後、Spring プロパティの設定(明示的なプロパティまたはオートワイヤーから)が発生する前に操作を実行します。 |
ObjectSE | postProcessBeforeInitialization(ObjectSE bean, StringSE beanName) Bean 初期化コールバック(InitializingBean の afterPropertiesSet またはカスタム init メソッドなど)の前に、この BeanPostProcessor を指定された新しい Bean インスタンスに適用します。 |
ObjectSE | postProcessBeforeInstantiation(ClassSE<?> beanClass, StringSE beanName) ターゲット Bean がインスタンス化される前に、この BeanPostProcessor を適用します。 |
PropertyValues | postProcessProperties(PropertyValues pvs, ObjectSE bean, StringSE beanName) ファクトリが特定の Bean に適用する前に、特定のプロパティ値を後処理します。プロパティ記述子は必要ありません。 |
ClassSE<?> | predictBeanType(ClassSE<?> beanClass, StringSE beanName) 最終的にこのプロセッサーの InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(java.lang.Class<?>, java.lang.String) コールバックから返される Bean の型を予測します。 |
void | setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry) 使用する AdvisorAdapterRegistry を指定します。 |
void | setApplyCommonInterceptorsFirst(boolean applyCommonInterceptorsFirst) Bean 固有のインターセプターの前に共通インターセプターを適用するかどうかを設定します。 |
void | setBeanFactory(BeanFactory beanFactory) 所有ファクトリを Bean インスタンスに提供するコールバック。 |
void | setCustomTargetSourceCreators(TargetSourceCreator... targetSourceCreators) この順序で適用されるカスタム TargetSourceCreators を設定します。 |
void | setFrozen(boolean frozen) プロキシを凍結するかどうかを設定し、作成後にアドバイスが追加されないようにします。 |
void | setInterceptorNames(StringSE... interceptorNames) 共通インターセプターを設定します。 |
protected boolean | shouldProxyTargetClass(ClassSE<?> beanClass, StringSE beanName) 指定された Bean を、インターフェースではなくターゲットクラスでプロキシするかどうかを決定します。 |
protected boolean | shouldSkip(ClassSE<?> beanClass, StringSE beanName) 指定された Bean がこのポストプロセッサーによる自動プロキシと見なされない場合、サブクラスはこのメソッドをオーバーライドして true を返す必要があります。 |
protected ObjectSE | wrapIfNecessary(ObjectSE bean, StringSE beanName, ObjectSE cacheKey) 必要に応じて、指定された Bean をラップします。 |
evaluateProxyInterfaces, getOrder, getProxyClassLoader, isConfigurationCallbackInterface, isInternalLanguageInterface, setBeanClassLoader, setOrder, setProxyClassLoader
copyFrom, isExposeProxy, isOpaque, isOptimize, isProxyTargetClass, setExposeProxy, setOpaque, setOptimize, setProxyTargetClass, toString
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, waitSE, waitSE, waitSE
postProcessPropertyValues
protected static final ObjectSE[] PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS
protected final Log logger
public void setFrozen(boolean frozen)
プロキシが作成される前にプロキシ構成が凍結されるのを防ぐために、スーパークラスからオーバーライドされます。
ProxyConfig
の setFrozen
public boolean isFrozen()
ProxyConfig
ProxyConfig
の isFrozen
public void setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry)
AdvisorAdapterRegistry
を指定します。 デフォルトはグローバル AdvisorAdapterRegistry
です。
public void setCustomTargetSourceCreators(TargetSourceCreator... targetSourceCreators)
TargetSourceCreators
を設定します。リストが空の場合、またはすべてが null を返す場合、Bean ごとに SingletonTargetSource
が作成されます。TargetSourceCreators は、アドバイスやアドバイザーが見つからなかったターゲット Bean でも起動することに注意してください。TargetSourceCreator
が特定の Bean の TargetSource
を返す場合、その Bean はどのような場合でもプロキシされます。
TargetSourceCreators
は、このポストプロセッサーが BeanFactory
で使用され、その BeanFactoryAware
コールバックがトリガーされた場合にのみ呼び出すことができます。
targetSourceCreators
- TargetSourceCreators
のリスト。順序は重要です。最初に一致した TargetSourceCreator
から返された TargetSource
(つまり、null 以外を返す最初の TargetSource
)が使用されます。public void setInterceptorNames(StringSE... interceptorNames)
このプロパティが設定されていない場合、共通のインターセプターはゼロになります。マッチングアドバイザーなどの「特定の」インターセプターが必要な場合は、これは完全に有効です。
public void setApplyCommonInterceptorsFirst(boolean applyCommonInterceptorsFirst)
public void setBeanFactory(BeanFactory beanFactory)
BeanFactoryAware
通常の Bean プロパティの設定後、ただし InitializingBean.afterPropertiesSet()
またはカスタム init-method などの初期化コールバックの前に呼び出されます。
BeanFactoryAware
の setBeanFactory
beanFactory
- 所有 BeanFactory(非 null
)。Bean は、ファクトリのメソッドをすぐに呼び出すことができます。BeanInitializationException
@Nullable protected BeanFactory getBeanFactory()
BeanFactory
を返します。このポストプロセッサーは Bean ファクトリに属している必要がないため、null
の場合があります。@Nullable public ClassSE<?> predictBeanType(ClassSE<?> beanClass, StringSE beanName)
SmartInstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(java.lang.Class<?>, java.lang.String)
コールバックから返される Bean の型を予測します。 デフォルトの実装は null
を返します。
SmartInstantiationAwareBeanPostProcessor
の predictBeanType
beanClass
- Bean の生のクラス beanName
- Bean の名前 null
@Nullable public ConstructorSE<?>[] determineCandidateConstructors(ClassSE<?> beanClass, StringSE beanName)
SmartInstantiationAwareBeanPostProcessor
デフォルトの実装は null
を返します。
SmartInstantiationAwareBeanPostProcessor
の determineCandidateConstructors
beanClass
- Bean の生のクラス (非 null
)beanName
- Bean の名前 null
public ObjectSE getEarlyBeanReference(ObjectSE bean, StringSE beanName)
SmartInstantiationAwareBeanPostProcessor
このコールバックは、ポストプロセッサーにラッパーを早期に公開する機会を与えます。つまり、ターゲット Bean インスタンスが完全に初期化される前。公開されたオブジェクトは、BeanPostProcessor.postProcessBeforeInitialization(java.lang.Object, java.lang.String)
/BeanPostProcessor.postProcessAfterInitialization(java.lang.Object, java.lang.String)
が他に公開するものと同等である必要があります。このメソッドによって返されるオブジェクトは、ポストプロセッサーが上記の後処理コールバックとは異なるラッパーを返さない限り、Bean 参照として使用されることに注意してください。言い換えると、これらのポストプロセスコールバックは、最終的に同じ参照を公開するか、代わりに後続のコールバックから未加工の Bean インスタンスを返す可能性があります(影響を受ける Bean のラッパーがこのメソッドの呼び出し用にすでに構築されている場合は、公開されます。デフォルトで最終的な Bean 参照として)。
デフォルトの実装は、指定された bean
をそのまま返します。
SmartInstantiationAwareBeanPostProcessor
の getEarlyBeanReference
bean
- 生の Bean インスタンス beanName
- Bean の名前 public ObjectSE postProcessBeforeInstantiation(ClassSE<?> beanClass, StringSE beanName)
InstantiationAwareBeanPostProcessor
このメソッドによって null 以外のオブジェクトが返された場合、Bean 作成プロセスは短絡されます。適用される追加の処理は、構成された BeanPostProcessors
からの BeanPostProcessor.postProcessAfterInitialization(java.lang.Object, java.lang.String)
コールバックのみです。
このコールバックは、Bean クラスを持つ Bean 定義、および返された Bean 型がここに渡されるファクトリメソッド定義に適用されます。
ポストプロセッサーは、ここで返される Bean オブジェクトの型を予測するために、拡張 SmartInstantiationAwareBeanPostProcessor
インターフェースを実装できます。
デフォルトの実装は null
を返します。
InstantiationAwareBeanPostProcessor
の postProcessBeforeInstantiation
beanClass
- インスタンス化される Bean のクラス beanName
- Bean の名前 null
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(java.lang.Object, java.lang.String)
, AbstractBeanDefinition.getBeanClass()
, AbstractBeanDefinition.getFactoryMethodName()
public boolean postProcessAfterInstantiation(ObjectSE bean, StringSE beanName)
InstantiationAwareBeanPostProcessor
これは、Spring のオートワイヤーが開始される直前の、指定された Bean インスタンスでカスタムフィールドインジェクションを実行するための理想的なコールバックです。
デフォルトの実装は true
を返します。
InstantiationAwareBeanPostProcessor
の postProcessAfterInstantiation
bean
- プロパティがまだ設定されていない状態で作成された Bean インスタンス beanName
- Bean の名前 true
。プロパティの入力をスキップする必要がある場合は false
。通常の実装では true
を返します。false
を返すと、後続の InstantiationAwareBeanPostProcessor インスタンスがこの Bean インスタンスで呼び出されなくなります。InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation(java.lang.Class<?>, java.lang.String)
public PropertyValues postProcessProperties(PropertyValues pvs, ObjectSE bean, StringSE beanName)
InstantiationAwareBeanPostProcessor
実装は、カスタム InstantiationAwareBeanPostProcessor.postProcessPropertyValues(org.springframework.beans.PropertyValues, java.beans.PropertyDescriptor[], java.lang.Object, java.lang.String)
実装を提供する場合は null
(デフォルト)を返し、そうでない場合は pvs
を返す必要があります。このインターフェースの将来のバージョン(InstantiationAwareBeanPostProcessor.postProcessPropertyValues(org.springframework.beans.PropertyValues, java.beans.PropertyDescriptor[], java.lang.Object, java.lang.String)
が削除された)では、デフォルトの実装は、指定された pvs
をそのまま直接返します。
InstantiationAwareBeanPostProcessor
の postProcessProperties
pvs
- ファクトリが適用しようとしているプロパティ値 (非 null
)bean
- Bean インスタンスは作成されましたが、そのプロパティはまだ設定されていません beanName
- Bean の名前 InstantiationAwareBeanPostProcessor.postProcessPropertyValues(org.springframework.beans.PropertyValues, java.beans.PropertyDescriptor[], java.lang.Object, java.lang.String)
の呼び出しを継続する null
(現在の Bean クラスに初期化された PropertyDescriptor
が必要)InstantiationAwareBeanPostProcessor.postProcessPropertyValues(org.springframework.beans.PropertyValues, java.beans.PropertyDescriptor[], java.lang.Object, java.lang.String)
public ObjectSE postProcessBeforeInitialization(ObjectSE bean, StringSE beanName)
BeanPostProcessor
afterPropertiesSet
またはカスタム init メソッドなど)の前に、この BeanPostProcessor
を指定された新しい Bean インスタンスに適用します。Bean にはすでにプロパティ値が入力されています。返された Bean インスタンスは、元のラッパーの可能性があります。 デフォルトの実装は、指定された bean
をそのまま返します。
BeanPostProcessor
の postProcessBeforeInitialization
bean
- 新しい Bean インスタンス beanName
- Bean の名前 null
の場合、後続の BeanPostProcessors は呼び出されません InitializingBean.afterPropertiesSet()
public ObjectSE postProcessAfterInitialization(@Nullable ObjectSE bean, StringSE beanName)
BeanPostProcessor
の postProcessAfterInitialization
bean
- 新しい Bean インスタンス beanName
- Bean の名前 null
の場合、後続の BeanPostProcessors は呼び出されません getAdvicesAndAdvisorsForBean(java.lang.Class<?>, java.lang.String, org.springframework.aop.TargetSource)
protected ObjectSE getCacheKey(ClassSE<?> beanClass, @Nullable StringSE beanName)
メモ: 4.2.3 以降、この実装は連結されたクラス / 名前の文字列を返すのではなく、可能な限り最も効率的なキャッシュキーを返します。: プレーンな Bean 名。FactoryBean
の場合は BeanFactory.FACTORY_BEAN_PREFIX
が前に付加されます。または、Bean 名が指定されていない場合は、指定された Bean Class
がそのまま使用されます。
beanClass
- Bean クラス beanName
- Bean 名 protected ObjectSE wrapIfNecessary(ObjectSE bean, StringSE beanName, ObjectSE cacheKey)
bean
- 生の Bean インスタンス beanName
- Bean の名前 cacheKey
- メタデータアクセスのキャッシュキー protected boolean isInfrastructureClass(ClassSE<?> beanClass)
デフォルトの実装では、アドバイス、アドバイザ、AopInfrastructureBeans をインフラストラクチャクラスと見なします。
beanClass
- Bean のクラス Advice
, Advisor
, AopInfrastructureBean
, shouldSkip(java.lang.Class<?>, java.lang.String)
protected boolean shouldSkip(ClassSE<?> beanClass, StringSE beanName)
true
を返す必要があります。 時々、これが起こるのを避けることができるようにする必要があります。循環参照につながる場合、または既存のターゲットインスタンスを保持する必要がある場合。この実装は、Bean 名が AutowireCapableBeanFactory
の規則に従って「元のインスタンス」を示さない限り、false
を返します。
beanClass
- Bean のクラス beanName
- Bean の名前 AutowireCapableBeanFactory.ORIGINAL_INSTANCE_SUFFIX
@Nullable protected TargetSource getCustomTargetSource(ClassSE<?> beanClass, StringSE beanName)
null
を返します。この実装では、"customTargetSourceCreators" プロパティを使用します。サブクラスはこのメソッドをオーバーライドして、別のメカニズムを使用できます。
beanClass
- TargetSource を作成する Bean のクラス beanName
- Bean の名前 setCustomTargetSourceCreators(org.springframework.aop.framework.autoproxy.TargetSourceCreator...)
protected ObjectSE createProxy(ClassSE<?> beanClass, @Nullable StringSE beanName, @Nullable ObjectSE[] specificInterceptors, TargetSource targetSource)
beanClass
- Bean のクラス beanName
- Bean の名前 specificInterceptors
- この Bean に固有のインターセプターのセット (空でもかまいませんが、null にはできません)targetSource
- プロキシ用の TargetSource、Bean にアクセスするように事前設定済み buildAdvisors(java.lang.String, java.lang.Object[])
protected boolean shouldProxyTargetClass(ClassSE<?> beanClass, @Nullable StringSE beanName)
対応する Bean 定義の "preserveTargetClass" attribute
をチェックします。
beanClass
- Bean のクラス beanName
- Bean の名前 AutoProxyUtils.shouldProxyTargetClass(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.lang.String)
protected boolean advisorsPreFiltered()
デフォルトは false
です。サブクラスは、常に事前フィルタリングされたアドバイザを常に返す場合、これをオーバーライドする場合があります。
getAdvicesAndAdvisorsForBean(java.lang.Class<?>, java.lang.String, org.springframework.aop.TargetSource)
, Advised.setPreFiltered(boolean)
protected Advisor[] buildAdvisors(@Nullable StringSE beanName, @Nullable ObjectSE[] specificInterceptors)
beanName
- Bean の名前 specificInterceptors
- この Bean に固有のインターセプターのセット (空でもかまいませんが、null にはできません)protected void customizeProxyFactory(ProxyFactory proxyFactory)
デフォルトの実装は空です。
proxyFactory
- TargetSource およびインターフェースですでに構成されており、このメソッドが戻った直後にプロキシを作成するために使用される ProxyFactory@Nullable protected abstract ObjectSE[] getAdvicesAndAdvisorsForBean(ClassSE<?> beanClass, StringSE beanName, @Nullable TargetSource customTargetSource) throws BeansException
beanClass
- アドバイスする Bean のクラス beanName
- Bean の名前 customTargetSource
- getCustomTargetSource(java.lang.Class<?>, java.lang.String)
メソッドによって返された TargetSource: は無視できます。カスタムターゲットソースが使用されていない場合は、null
になります。null
で、一般的なインターセプターさえ使用していません。定数 DO_NOT_PROXY および PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS を参照してください。BeansException
- エラーの場合 DO_NOT_PROXY
, PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS