public class ProxyFactoryBean extends ProxyCreatorSupport implements FactoryBean<ObjectSE>, BeanClassLoaderAware, BeanFactoryAware
BeanFactory
の Bean に基づいて AOP プロキシを構築する FactoryBean
実装。MethodInterceptors
および Advisors
は、"interceptorNames" プロパティで指定された現在の Bean ファクトリ内の Bean 名のリストによって識別されます。リストの最後のエントリは、ターゲット Bean または TargetSource
の名前にすることができますが、通常は代わりに "targetName" /"target" /"targetSource" プロパティを使用することをお勧めします。
グローバルインターセプターとアドバイザーをファクトリレベルで追加できます。指定されたものは、"xxx*" エントリがリストに含まれているインターセプターリストで展開され、指定されたプレフィックスを Bean 名に一致させます(たとえば、"global *" は "globalBean1" と "globalBean2" の両方に一致します。"*" すべての定義されたインターセプター)。一致するインターセプターは、Ordered
インターフェースを実装している場合、返された順序値に従って適用されます。
プロキシインターフェースが指定されている場合は JDK プロキシを作成し、そうでない場合は実際のターゲットクラスの CGLIB プロキシを作成します。動的サブクラスは実行時に作成されるため、後者はターゲットクラスに final メソッドがない場合にのみ機能することに注意してください。
このファクトリから取得したプロキシを Advised
にキャストしたり、ProxyFactoryBean 参照を取得してプログラムで操作したりすることができます。これは、独立している既存のプロトタイプ参照では機能しません。ただし、後でファクトリから入手したプロトタイプでは機能します。インターセプトの変更は、シングルトン(既存の参照を含む)ですぐに機能します。ただし、インターフェースまたはターゲットを変更するには、ファクトリから新しいインスタンスを取得する必要があります。これは、ファクトリから取得されたシングルトンインスタンスが同じオブジェクト ID を持たないことを意味します。ただし、インターセプターとターゲットは同じであり、参照を変更するとすべてのオブジェクトが変更されます。
setInterceptorNames(java.lang.String...)
, setProxyInterfaces(java.lang.Class<?>[])
, MethodInterceptor
, Advisor
, Advised
, 直列化された形式 修飾子と型 | フィールドと説明 |
---|---|
static StringSE | GLOBAL_SUFFIX インターセプターリストの値のこのサフィックスは、グローバルを展開することを示します。 |
protected Log | logger |
EMPTY_TARGET_SOURCE
コンストラクターと説明 |
---|
ProxyFactoryBean() |
修飾子と型 | メソッドと説明 |
---|---|
protected void | adviceChanged() アドバイスを変更したら、吹き飛ばしてシングルトンを再キャッシュします。 |
protected ClassSE<?> | createCompositeInterface(ClassSE<?>[] interfaces) 指定されたインターフェースの複合インターフェースクラスを作成し、指定されたインターフェースを 1 つの単一クラスに実装します。 |
ObjectSE | getObject() プロキシを返します。 |
ClassSE<?> | getObjectType() プロキシの型を返します。 |
protected ObjectSE | getProxy(AopProxy aopProxy) 公開するプロキシオブジェクトを返します。 |
boolean | isSingleton() このファクトリによって管理されるオブジェクトはシングルトンですか? つまり、 FactoryBean.getObject() は常に同じオブジェクト(キャッシュ可能な参照)を返しますか? |
void | setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry) 使用する AdvisorAdapterRegistry を指定します。 |
void | setAutodetectInterfaces(boolean autodetectInterfaces) 指定がない場合にプロキシインターフェースを自動検出するかどうかを設定します。 |
void | setBeanClassLoader(ClassLoaderSE classLoader) Bean class loader SE を Bean インスタンスに提供するコールバック。 |
void | setBeanFactory(BeanFactory beanFactory) 所有ファクトリを Bean インスタンスに提供するコールバック。 |
void | setFrozen(boolean frozen) この構成をフリーズするかどうかを設定します。 |
void | setInterceptorNames(StringSE... interceptorNames) Advice/Advisor Bean 名のリストを設定します。 |
void | setProxyClassLoader(ClassLoaderSE classLoader) ClassLoader を設定して、プロキシクラスを生成します。 |
void | setProxyInterfaces(ClassSE<?>[] proxyInterfaces) プロキシするインターフェースの名前を設定します。 |
void | setSingleton(boolean singleton) シングルトンプロパティの値を設定します。 |
void | setTargetName(StringSE targetName) ターゲット Bean の名前を設定します。 |
addListener, createAopProxy, getAopProxyFactory, isActive, removeListener, setAopProxyFactory
addAdvice, addAdvice, addAdvisor, addAdvisor, addAdvisors, addAdvisors, addInterface, adviceIncluded, copyConfigurationFrom, copyConfigurationFrom, countAdvicesOfType, getAdvisorChainFactory, getAdvisors, getAdvisorsInternal, getInterceptorsAndDynamicInterceptionAdvice, getProxiedInterfaces, getTargetClass, getTargetSource, indexOf, indexOf, isInterfaceProxied, isPreFiltered, removeAdvice, removeAdvisor, removeAdvisor, removeInterface, replaceAdvisor, setAdvisorChainFactory, setInterfaces, setPreFiltered, setTarget, setTargetClass, setTargetSource, toProxyConfigString, toString, updateAdvisorArray
copyFrom, isExposeProxy, isFrozen, isOpaque, isOptimize, isProxyTargetClass, setExposeProxy, setOpaque, setOptimize, setProxyTargetClass
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, waitSE, waitSE, waitSE
isExposeProxy, isFrozen, isProxyTargetClass, setExposeProxy
public static final StringSE GLOBAL_SUFFIX
protected final Log logger
public void setProxyInterfaces(ClassSE<?>[] proxyInterfaces) throws ClassNotFoundExceptionSE
これは本質的には "setInterfaces" 方式と同等ですが、TransactionProxyFactoryBean の "setProxyInterfaces" を反映しています。
public void setInterceptorNames(StringSE... interceptorNames)
参照される Bean は、Interceptor、Advisor、Advice のいずれかの型である必要があります。リストの最後のエントリは、ファクトリ内の任意の Bean の名前にすることができます。Advice でも Advisor でもない場合は、新しい SingletonTargetSource が追加されてラップされます。このようなターゲット Bean は、"target" または "targetSource" または "targetName" プロパティが設定されている場合は使用できません。その場合、"interceptorNames" 配列には Advice/Advisor Bean 名のみが含まれている必要があります。
注意: "interceptorNames" リストの最終名としてターゲット Bean を指定することは非推奨であり、将来の Spring バージョンでは削除される予定です。代わりに "targetName"
プロパティを使用してください。
public void setTargetName(StringSE targetName)
「target "/"targetSource" プロパティ」を使用して、ターゲットオブジェクトまたは TargetSource オブジェクトをそれぞれ直接指定することもできます。
public void setAutodetectInterfaces(boolean autodetectInterfaces)
デフォルトは "true" です。インターフェースが指定されていない場合、このフラグをオフにして、完全なターゲットクラスの CGLIB プロキシを作成します。
public void setSingleton(boolean singleton)
public void setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry)
public void setFrozen(boolean frozen)
ProxyConfig
設定がフリーズしている場合、アドバイスの変更はできません。これは最適化に役立ち、呼び出し側が Advised にキャストした後で構成を操作できないようにする場合に役立ちます。
ProxyConfig
の setFrozen
public void setProxyClassLoader(@Nullable ClassLoaderSE classLoader)
デフォルトは Bean ClassLoader、つまり、すべての Bean クラスをロードするために、それを含む BeanFactory によって使用される ClassLoader です。これは、特定のプロキシに対してここでオーバーライドできます。
public void setBeanClassLoader(ClassLoaderSE classLoader)
BeanClassLoaderAware
class loader
SE を Bean インスタンスに提供するコールバック。 通常の Bean プロパティの設定後、ただし InitializingBean's
InitializingBean.afterPropertiesSet()
メソッドやカスタム init-method などの初期化コールバックの前に呼び出されます。
BeanClassLoaderAware
の setBeanClassLoader
classLoader
- 所有クラスローダー public void setBeanFactory(BeanFactory beanFactory)
BeanFactoryAware
通常の Bean プロパティの設定後、ただし InitializingBean.afterPropertiesSet()
またはカスタム init-method などの初期化コールバックの前に呼び出されます。
BeanFactoryAware
の setBeanFactory
beanFactory
- 所有 BeanFactory(非 null
)。Bean は、ファクトリのメソッドをすぐに呼び出すことができます。BeanInitializationException
@Nullable public ObjectSE getObject() throws BeansException
getObject()
への呼び出しごとに作成されます。FactoryBean<ObjectSE>
の getObject
BeansException
FactoryBeanNotInitializedException
public ClassSE<?> getObjectType()
FactoryBean<ObjectSE>
の getObjectType
null
TargetSource.getTargetClass()
public boolean isSingleton()
FactoryBean
FactoryBean.getObject()
は常に同じオブジェクト(キャッシュ可能な参照)を返しますか? 注意 : FactoryBean がシングルトンオブジェクトを保持することを示す場合、getObject()
から返されたオブジェクトは所有 BeanFactory によってキャッシュされる可能性があります。FactoryBean が常に同じ参照を公開しない限り、true
を返さないでください。
FactoryBean 自体のシングルトンステータスは、通常、所有する BeanFactory によって提供されます。通常、そこではシングルトンとして定義する必要があります。
注意 : false
を返すこのメソッドは、返されるオブジェクトが独立したインスタンスであることを必ずしも示しません。拡張 SmartFactoryBean
インターフェースの実装は、SmartFactoryBean.isPrototype()
メソッドを通じて独立したインスタンスを明示的に示す場合があります。この拡張インターフェースを実装しないプレーンな FactoryBean
実装は、isSingleton()
実装が false
を返す場合、常に独立したインスタンスを返すと単純に想定されます。
FactoryBean
は通常シングルトンインスタンスを管理するため、デフォルトの実装では true
が返されます。
FactoryBean<ObjectSE>
の isSingleton
FactoryBean.getObject()
, SmartFactoryBean.isPrototype()
protected ClassSE<?> createCompositeInterface(ClassSE<?>[] interfaces)
デフォルトの実装は、指定されたインターフェースの JDK プロキシクラスを構築します。
interfaces
- マージするインターフェース Proxy.getProxyClass(java.lang.ClassLoader, java.lang.Class<?>...)
SEprotected ObjectSE getProxy(AopProxy aopProxy)
デフォルトの実装では、ファクトリの Bean クラスローダーで getProxy
呼び出しを使用します。オーバーライドして、カスタムクラスローダーを指定できます。
aopProxy
- プロキシを取得するために準備された AopProxy インスタンス AopProxy.getProxy(ClassLoader)
protected void adviceChanged()