クラス ProxyFactoryBean

実装されたすべてのインターフェース:
SerializableSEAdvisedTargetClassAwareAwareBeanClassLoaderAwareBeanFactoryAwareFactoryBean<ObjectSE>

public class ProxyFactoryBean extends ProxyCreatorSupport implements FactoryBean<ObjectSE>, BeanClassLoaderAware, BeanFactoryAware
Spring 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 を持たないことを意味します。ただし、それらには同じインターセプターとターゲットがあり、参照を変更するとすべてのオブジェクトが変更されます。

作成者:
Rod Johnson, Juergen Hoeller
関連事項:
  • フィールドの詳細

    • GLOBAL_SUFFIX

      public static final StringSE GLOBAL_SUFFIX
      インターセプターリストの値のこのサフィックスは、グローバルを展開することを示します。
      関連事項:
    • logger

      protected final Log logger
  • コンストラクターの詳細

    • ProxyFactoryBean

      public ProxyFactoryBean()
  • メソッドの詳細

    • setProxyInterfaces

      public void setProxyInterfaces(ClassSE<?>[] proxyInterfaces) throws ClassNotFoundExceptionSE
      プロキシするインターフェースの名前を設定します。インターフェースが指定されていない場合、実際のクラスの CGLIB が作成されます。

      これは基本的に "setInterfaces" メソッドと同等ですが、TransactionProxyFactoryBean の "setProxyInterfaces" を反映しています。

      例外:
      ClassNotFoundExceptionSE
      関連事項:
    • setInterceptorNames

      public void setInterceptorNames(StringSE... interceptorNames)
      Advice/Advisor Bean 名のリストを設定します。これは常に、Bean ファクトリでこのファクトリ Bean を使用するように設定する必要があります。

      参照される Bean の型は Interceptor、Advisor、Advice でなければなりません。リストの最後のエントリは、ファクトリ内の任意の Bean の名前にすることができます。アドバイスでもアドバイザでもない場合は、新しい SingletonTargetSource を追加してラップします。このようなターゲット Bean は、"target"、"targetSource"、"targetName" プロパティが設定されている場合は使用できません。その場合、"interceptorNames" 配列には、Advisor/Advisor Bean 名のみを含める必要があります。

      注: ターゲットの Bean を "interceptorNames" リストの最終名として指定することは非推奨であり、将来の Spring バージョンでは削除される予定です。代わりに "targetName" プロパティを使用してください。

      関連事項:
    • setTargetName

      public void setTargetName(StringSE targetName)
      ターゲット Bean の名前を設定します。これは、"interceptorNames" 配列の最後にターゲット名を指定する代わりになります。

      「target "/"targetSource" プロパティ」を使用して、ターゲットオブジェクトまたは TargetSource オブジェクトをそれぞれ直接指定することもできます。

      関連事項:
    • setAutodetectInterfaces

      public void setAutodetectInterfaces(boolean autodetectInterfaces)
      指定がない場合にプロキシインターフェースを自動検出するかどうかを設定します。

      デフォルトは "true" です。インターフェースが指定されていない場合、このフラグをオフにして、完全なターゲットクラスの CGLIB プロキシを作成します。

      関連事項:
    • setSingleton

      public void setSingleton(boolean singleton)
      シングルトンプロパティの値を設定します。このファクトリが常に同じプロキシインスタンス(同じターゲットを意味する)を返す必要があるか、プロトタイプ Bean 定義から取得された場合、ターゲットとインターセプターも新しいインスタンスである可能性があることを意味する新しいプロトタイプインスタンスを返す必要があるかどうかを制御しますこれにより、オブジェクトグラフの独立性 / 一意性を細かく制御できます。
    • setAdvisorAdapterRegistry

      public void setAdvisorAdapterRegistry(AdvisorAdapterRegistry advisorAdapterRegistry)
      使用する AdvisorAdapterRegistry を指定します。デフォルトはグローバル AdvisorAdapterRegistry です。
      関連事項:
    • setFrozen

      public void setFrozen(boolean frozen)
      クラスからコピーされた説明: ProxyConfig
      この構成をフリーズするかどうかを設定します。

      設定がフリーズしている場合、アドバイスの変更はできません。これは最適化に役立ち、呼び出し側が Advised にキャストした後で構成を操作できないようにする場合に役立ちます。

      オーバーライド:
      クラス ProxyConfigsetFrozen 
    • setProxyClassLoader

      public void setProxyClassLoader(@Nullable ClassLoaderSE classLoader)
      ClassLoader を設定して、プロキシクラスを生成します。

      デフォルトは Bean ClassLoader、つまり、すべての Bean クラスをロードするために、それを含む BeanFactory によって使用される ClassLoader です。これは、特定のプロキシに対してここでオーバーライドできます。

    • setBeanClassLoader

      public void setBeanClassLoader(ClassLoaderSE classLoader)
      インターフェースからコピーされた説明: BeanClassLoaderAware
      Bean class loaderSE を Bean インスタンスに提供するコールバック。

      通常の Bean プロパティの設定、ただし InitializingBean's InitializingBean.afterPropertiesSet() メソッドやカスタム init-method などの初期化コールバックの前に呼び出さます。

      次で指定:
      インターフェース BeanClassLoaderAwaresetBeanClassLoader 
      パラメーター:
      classLoader - 所有クラスローダー
    • setBeanFactory

      public void setBeanFactory(BeanFactory beanFactory)
      インターフェースからコピーされた説明: BeanFactoryAware
      所有ファクトリを Bean インスタンスに提供するコールバック。

      通常の Bean プロパティの設定後、ただし InitializingBean.afterPropertiesSet() またはカスタム init-method などの初期化コールバックの前に呼び出されます。

      次で指定:
      インターフェース BeanFactoryAwaresetBeanFactory 
      パラメーター:
      beanFactory - 所有 BeanFactory(非 null)。Bean は、ファクトリのメソッドをすぐに呼び出すことができます。
      関連事項:
    • getObject

      @Nullable public ObjectSE getObject() throws BeansException
      プロキシを返します。クライアントがこのファクトリ Bean から Bean を取得すると呼び出されます。このファクトリによって返される AOP プロキシのインスタンスを作成します。インスタンスはシングルトン用にキャッシュされ、プロキシの getObject() への呼び出しごとに作成されます。
      次で指定:
      インターフェース FactoryBean<ObjectSE>getObject 
      戻り値:
      このファクトリの現在の状態を反映する新しい AOP プロキシ
      例外:
      BeansException
      関連事項:
    • getObjectType

      @Nullable public ClassSE<?> getObjectType()
      プロキシの型を返します。すでに作成されている場合はシングルトンインスタンスをチェックします。それ以外の場合は、プロキシインターフェース(単一の場合のみ)、ターゲット Bean 型、TargetSource のターゲットクラスにフォールバックします。
      次で指定:
      インターフェース FactoryBean<ObjectSE>getObjectType 
      戻り値:
      この FactoryBean が作成するオブジェクトの型、または呼び出し時に不明な場合は null 
      関連事項:
    • isSingleton

      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 
      戻り値:
      公開されたオブジェクトがシングルトンかどうか
      関連事項:
    • getProxy

      protected ObjectSE getProxy(AopProxy aopProxy)
      公開するプロキシオブジェクトを返します。

      デフォルトの実装では、ファクトリの Bean クラスローダーで getProxy 呼び出しを使用します。オーバーライドして、カスタムクラスローダーを指定できます。

      パラメーター:
      aopProxy - プロキシを取得するために準備された AopProxy インスタンス
      戻り値:
      公開するプロキシオブジェクト
      関連事項:
    • adviceChanged

      protected void adviceChanged()
      アドバイスを変更したら、吹き飛ばしてシングルトンを再キャッシュします。
      オーバーライド:
      クラス ProxyCreatorSupportadviceChanged 
      関連事項: