0

私たちは、一連の責任の原則を実装するコードベースのハンドラクラスの階層を持っています。抽象Spring Beanをコンストラクタ-Argとして使用する

public abstract class AbstractHandler { 
    public AbstractHandler(final AbstractHandler next, final PropertyName propertyName) { 
    this.next = next; 
    this.propertyName = propertyName; 
    } 
    ... 

public class OneConcreteChildHandler extends AbstractHandler { 
    public OneConcreteChildHandler(final AbstractHandler next) { 
    super(next, PropertyName.OneConcreteChild); 
    } 
    ... 

は現在、新たに実装されたサービスへの具体的な子クラスのいずれかのインスタンスを注入する必要がありますあり、抽象親クラスがあり、それはいくつかの子クラスによって拡張され、また、そのコンストラクタで抽象を受信しますこれをXMLで構成する必要があります。私たちは、抽象親クラスの抽象Beanを構成することができますが、これがその後、コンストラクタ-argをコンクリートの子豆

<bean id="abstractHandler" abstract="true" class="...AbstractHandler" /> 

<bean id="oneConcreteChildHandler" class="...OneConcreteChildHandler" parent="abstractHandler"> 
    <constructor-arg ref="abstractHandler"/> //"abstract bean can not be used here" 
</bean> 

<bean id="someService" class="...SomeService"> 
    <constructor-arg ref="oneConcreteChildHandler"/> 
    ... 

ためには、これを克服するためにどのような方法がありますとして使用することが許可されていないようですか?ハンドラクラス階層はレガシーコードであり、この時点でソースを変更することはできません。

答えて

2

ここでの主な問題は、抽象Beanを注入しようとしていることです。あなたはこれをしてはいけません。このabstractHandlerは、子Bean内のparentのマッピングにのみ使用する必要があります。それにもかかわらず、それは本当にあなたが欲しい/必要とするものであるとは見えません。このコンストラクタで抽象オブジェクトを渡すのではなく、別の子クラスのオブジェクトを渡します。あなたは、チェーンは、コンストラクタの引数nextは、そのようなnullになり、エンドポイントを、持っている必要があります。

<bean id="abstractHandler" abstract="true" class="...AbstractHandler" /> 

<bean id="oneConcreteChildHandler" class="...OneConcreteChildHandler" parent="abstractHandler"> 
     <constructor-arg ref="twoConcreteChildHandler"/> 
    </bean> 

<bean id="twoConcreteChildHandler" class=".." parent="abstractHandler"> 
    <constructor-arg name="next"> 
     <null /> 
    </constructor-arg> 
</bean> 

<bean id="someService" class="...SomeService"> 
    <constructor-arg ref="oneConcreteChildHandler"/> 
    ... 
+1

ありがとうございます。具体的な子クラスの中には、実際にはCoRチェーンを閉じる目的で既存のTailChildHandlerクラスがあり(そのコンストラクタにはsuper(null、null)が含まれています)、あなたのコンフィグレーションでtwoConcreteChildHandlerと同じ方法でそれを利用できます例。これにより問題が解決されます。 – hammerfest

0

Springの抽象Beanのコンセプトは、Javaの抽象クラスの概念と同じではありません。

Javaでは、抽象クラスのインスタンスをインスタンス化できないため、抽象Beanを抽象Java型にマップしようとすると、インスタンス化するときには機能しません。

代わりに、Servlet Filtersが(FilterChain経由で)どのように動作するか、またはSpring's HandlerInterceptor patternを確認することをお勧めします。

関連する問題