2017-02-21 69 views
0

我讀過,基於XML的Spring配置bean可以繼承工廠方法。
我試圖實現它:

控制器接口:Spring XML配置中的工廠方法bean繼承

public interface Controller { 
    String method(); 
} 

的ControllerFactory類:

public class ControllerFactory { 
    public Controller getController(String controllerName){ 
     switch(controllerName){ 
      case "OtherController": 
       return new OtherController(); 
      case "SampleController": 
       return new SampleController(); 
      default: 
       throw new IllegalArgumentException("Wrong controller name."); 
     } 
    } 
} 

SampleController實現:

public class SampleController implements Controller { 
    @Override 
    public String method() { 
     return "SampleController"; 
    } 
} 

OtherController實現:

public class OtherController implements Controller { 
    @Override 
    public String method() { 
     return "OtherController"; 
    } 
} 

但下面的XML配置:

<!--factory method inheritance --> 
<bean id="controllerFactory" class="factory.ControllerFactory"/> 
<bean id="parentController" abstract="true" factory-bean="controllerFactory" factory-method="getController"/> 
<bean id="otherController" parent="parentController"> 
    <constructor-arg index="0" value="OtherController"/> 
</bean> 

給出編譯時錯誤:

No matching constructor found in class 'Controller' 

我怎樣才能改變它有工廠方法豆繼承實施得當?

複製工廠方法配置子bean按預期工作:

<bean id="otherController" parent="parentController" factory-bean="controllerFactory" factory-method="getController"> 
    <constructor-arg index="0" value="OtherController"/> 
</bean> 

回答

1

變化豆ID爲parentController如下:

<bean id="parentController" class="factory.ControllerFactory" factory-bean="controllerFactory" factory-method="getController"> <constructor-arg index="0" value="OtherController"/> </bean>

試試這個可能有用。

+1

也傳遞構造函數。 – SachinSarawgi