2014-03-28 43 views
2

我想知道是否有可能使用註釋複製代碼這個XML和平:注射液ID在抽象類中的方法使用註釋

<bean id="mobileRedirectController" class="uk.co.web.device.MobileRedirectController"> 
    <property name="deviceUserAgent" ref="mobileUserAgent" /> 
</bean> 

<util:set id="mobileUserAgent"> 
    <value>Mobile</value> 
    <value>iPhone</value> 
    <value>...</value> 
</util:set> 

<bean id="tabletRedirectController" class="uk.co.web.device.TabletRedirectController"> 
    <property name="deviceUserAgent" ref="tabletUserAgent" /> 
</bean> 

<util:set id="tabletUserAgent"> 
    <value>iPad</value> 
    <value>...</value> 
</util:set> 

和我的課都是這樣(只有關我的問題的代碼):

public class MobileRedirectController extends AbstractRedirectController { 
} 

public class TabletRedirectController extends AbstractRedirectController { 
} 

public abstract class AbstractRedirectController { 
    protected Set<String> deviceUserAgent = new HashSet<String>(); 
    public void setDeviceUserAgent(Set<String> deviceUserAgent) { 
     this.deviceUserAgent = deviceUserAgent; 
    } 
} 

現在,如果我刪除XML的豆實例,我有這樣的事情:

<util:set id="mobileUserAgent"> 
    <value>Mobile</value> 
    <value>iPhone</value> 
    <value>...</value> 
</util:set> 

<util:set id="tabletUserAgent"> 
    <value>iPad</value> 
    <value>...</value> 
</util:set> 

及其類別:

@Controller("mobileRedirectController") 
public class MobileRedirectController extends AbstractRedirectController { 
} 

@Controller("tabletRedirectController") 
public class TabletRedirectController extends AbstractRedirectController { 
} 

public abstract class AbstractRedirectController { 
    protected Set<String> deviceUserAgent = new HashSet<String>(); 
    public void setDeviceUserAgent(Set<String> deviceUserAgent) { 
     this.deviceUserAgent = deviceUserAgent; 
    } 
} 

而現在我的問題,是有辦法注入在tabletRedirectController相關的控制器mobileRedirectController和tabletUserAgent我的列表mobileUserAgent不從AbstractRedirectController代碼移到MobileRedirectController和TabletRedirectController?

回答

1

您可以將代碼留在抽象控制器中,但您需要編寫一些額外的代碼來注入Set。在XML版本中,您明確地設置了屬性。使用註釋,你將需要使用構造函數或setter注入讓你感興趣的Set的保持。

@Controller("mobileRedirectController") 
public class MobileRedirectController extends AbstractRedirectController { 

    @Resource("mobileUserAgent") 
    public MobileRedirectController(Set<String> deviceUserAgent) { 
     setDeviceUserAgent(deviceUserAgent); 
    } 
} 

@Controller("tabletRedirectController") 
public class TabletRedirectController extends AbstractRedirectController { 

    @Resource("tabletUserAgent") 
    public TabletRedirectController(Set<String> deviceUserAgent) { 
     setDeviceUserAgent(deviceUserAgent); 
    } 
} 
+0

嗯好的,好主意的構造函數注入,並將其與'@資源(「mobileUserAgent」工程)''但不能用'@Autowire @Qualifier(「mobileUserAgent」),似乎我們不能用'@ Autowire'注入一個集合,你知道爲什麼這個限制嗎? –

+0

Spring版本<4中的IoC容器不支持基於泛型識別注入候選項。由於'@ Autowired'是分型的,這是一個問題。 '@ Resource'更適合通過名稱/ id來引用bean。 [更多參考資料請閱讀此文](http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s11.html#beans-autowired- annotation-qualifiers) – Bart