2017-10-18 30 views
-1

ここで尋ねる決定的な答えが見つからない - 1つのBeanに対してのみCGLIBプロキシを有効にすることは可能ですか?シナリオは次のとおりです - 私はautowiredクラスを持っていて、インターフェイスを実装していないので、今度はそのメソッドの小さなサブセットをカバーするインターフェイスを追加したいと思います。 このクラスのみが、Springのデフォルト動作に影響を与えないCGLIBを使用している(JDKの動的プロキシが優先されます)?
私はJavaベースの設定を使用しています。Springはインタフェースの代わりに実装を選択的に使用する

+1

なぜですか?あなたが間違っているインターフェースを使用している間に具体的なインスタンスにプログラムする必要がある場合、または少なくともあなたのインターフェースはあなたが表現しようとしている意図と一致しません。 –

+0

@ M.Deinum私は知っている、知っている、ありがとう。あなたはその質問に対する答えを知っていますか? – skwisgaar

+0

答えは基本的にそれを行うことではなく、適切なインターフェースを持ち、それを使用することではありません。この単一のインスタンスをプロキシ化するだけの場合は、プロキシを手動で作成するか、クラスベースのプロキシを有効にしてからすべてのものに使用する必要があります。 –

答えて

1

クラスは現在、クラスベースのプロキシを有効にするためのサポートはありません。代わりに、自分でプロキシを作成する必要があります。これの欠点は、Springがどのように動作するかについての親密な知識が必要であることです(これは私が持っていることです:))。

与えられたクラスにクラスベースのプロキシを作成するには、ProxyFactoryまたはProxyFactoryBeanを使用する必要があります。 @Beanメソッドは、実際のクラスではなくプロキシを返します。 Springはそれがすでにプロキシであることを検出するのに十分なほど巧妙です(少なくともそれはすべきです)。もう一度プロキシするのではなく、既に作成されたプロキシにアドバイスを追加する必要があります。自動配線やSpringが提供する他のすてきなものを壊さずにこの作業を行うには、これを処理する特定のBeanPostProcessorを作成したいと思うかもしれません。

public YourBeanPostProcessor implements BeanPostProcessor { 

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
     if (bean instanceof YourBean) { 
      ProxyFactory factory = new ProxyFactory(bean); 
      factory.setProxyTargetClass(true); 
      return factory.getProxy(); 
     } 
     return bean; 
    } 

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
     return bean; 
    } 
} 

これは通常、BeanPostProcessorと同じようにBeanとして登録します。

@Bean 
public static YourBeanPostProcessor yourBeanPostProcessor() { 
    return new YourBeanPostProcessor(); 
} 

事前に作成されたクラスベースのプロキシがあり、これをSpringが検出して使用する必要があります。

関連する問題