Java 在使用注释的抽象类的方法中按id注入
我想知道是否有可能使用注释再现这种xml代码的和平:Java 在使用注释的抽象类的方法中按id注入,java,spring,Java,Spring,我想知道是否有可能使用注释再现这种xml代码的和平: <bean id="mobileRedirectController" class="uk.co.web.device.MobileRedirectController"> <property name="deviceUserAgent" ref="mobileUserAgent" /> </bean> <util:set id="mobileUserAgent"> <valu
<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>
可移动的
苹果手机
...
iPad
...
我的类是这样的(只是与我的问题相关的代码):
公共类MobileDirectController扩展了AbstractRedirectController{
}
公共类TabletRedirectController扩展了AbstractRedirectController{
}
公共抽象类抽象重定向控制器{
受保护的集合deviceUserAgent=new HashSet();
public void setDeviceUserAgent(Set deviceUserAgent){
this.deviceUserAgent=deviceUserAgent;
}
}
现在,如果我删除bean实例化的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>
可移动的
苹果手机
...
iPad
...
课程包括:
@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;
}
}
@Controller(“MobileDirectController”)
公共类MobileDirectController扩展了AbstractRedirectController{
}
@控制器(“tabletRedirectController”)
公共类TabletRedirectController扩展了AbstractRedirectController{
}
公共抽象类抽象重定向控制器{
受保护的集合deviceUserAgent=new HashSet();
public void setDeviceUserAgent(Set deviceUserAgent){
this.deviceUserAgent=deviceUserAgent;
}
}
现在我的问题是,有没有办法将我的列表mobileUserAgent插入到相关控制器MobileDirectController和TabletDirectController中的tabletUserAgent中,而不将代码从AbstractRedirectController移动到MobileDirectController和TabletDirectController?您可以将代码留在抽象控制器中,但需要编写一些额外的代码来注入
集合
。在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);
}
}
@Controller(“MobileDirectController”)
公共类MobileDirectController扩展了AbstractRedirectController{
@资源(“移动代理”)
公用移动设备DirectController(设置设备用户代理){
setDeviceUserAgent(deviceUserAgent);
}
}
@控制器(“tabletRedirectController”)
公共类TabletRedirectController扩展了AbstractRedirectController{
@资源(“tabletUserAgent”)
公用TabletRedirectController(设置deviceUserAgent){
setDeviceUserAgent(deviceUserAgent);
}
}
hmmm好的,构造函数注入是个好主意,它可以与@Resource(“mobileUserAgent”)
一起工作,但不能与@Autowire@Qualifier(“mobileUserAgent”)
一起工作,似乎我们无法使用@Autowire
注入一个集合。您知道为什么会有这种限制吗?Spring版本<4中的IoC容器不支持基于泛型识别注入候选对象。由于@Autowired
是按类型划分的,因此这是一个问题@Resource
更适合按名称/id引用bean。[有关更多参考,请阅读此]()
@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);
}
}