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_SOURCEOBJECT_TYPE_ATTRIBUTE| コンストラクターと説明 |
|---|
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 loaderSE を 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, setAopProxyFactoryaddAdvice, addAdvice, addAdvisor, addAdvisor, addAdvisors, addAdvisors, addInterface, adviceIncluded, copyConfigurationFrom, copyConfigurationFrom, countAdvicesOfType, getAdvisorChainFactory, getAdvisorCount, getAdvisors, getAdvisorsInternal, getInterceptorsAndDynamicInterceptionAdvice, getProxiedInterfaces, getTargetClass, getTargetSource, indexOf, indexOf, isInterfaceProxied, isPreFiltered, removeAdvice, removeAdvisor, removeAdvisor, removeInterface, replaceAdvisor, setAdvisorChainFactory, setInterfaces, setPreFiltered, setTarget, setTargetClass, setTargetSource, toProxyConfigString, toStringcopyFrom, isExposeProxy, isFrozen, isOpaque, isOptimize, isProxyTargetClass, setExposeProxy, setOpaque, setOptimize, setProxyTargetClasscloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, waitSE, waitSE, waitSEisExposeProxy, isFrozen, isProxyTargetClass, setExposeProxypublic 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)
BeanClassLoaderAwareclass loaderSE を 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 BeansExceptionFactoryBeanNotInitializedExceptionpublic ClassSE<?> getObjectType()
FactoryBean<ObjectSE> の getObjectType null TargetSource.getTargetClass()public boolean isSingleton()
FactoryBeanFactoryBean.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()