2014-03-28 42 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