0

우리는 일련의 책임 원리를 구현하는 코드베이스에서 핸들러 클래스의 계층 구조를 가지고있다. 이 추상 상위 클래스이며, 그것은 또한 자신의 생성자에서 추상를받을 여러 자식 클래스에 의해 확장 우리는 지금 새롭게 구현 서비스에 구체적인 하위 클래스 중 하나의 인스턴스를 주입해야추상 Spring bean을 생성자 -argle로 사용한다.

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 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

여기서 중요한 문제는 추상적 인 빈을 주입하려고한다는 것입니다. 너는 그렇게해서는 안된다. 이 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

감사합니다. 우리는 방금 구체적인 자식 클래스들 사이에 실제로 CoC 체인을 닫는 목적을위한 기존의 TailChildHandler 클래스가 있음을 알아 냈습니다. (생성자에는 super (null, null)이 포함되어 있습니다.) 당신의 twoConcreteChildHandler와 같은 방식으로 설정에서 활용할 수 있습니다. 예. 이렇게하면 문제가 해결됩니다. – hammerfest

0

봄의 추상적 인 콩 개념은 자바의 추상 클래스의 개념과 동일하지 않습니다.

자바에서는 추상 클래스의 인스턴스를 인스턴스화 할 수 없기 때문에 추상 자바 클래스를 인스턴스화 할 시간이되면 추상 자바 유형에 매핑하려고 시도하지 않습니다.

대신 Servlet Filters (FilterChain을 통해) 또는 Spring's HandlerInterceptor pattern의 작동 방식을 살펴 보시기 바랍니다.

관련 문제