Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在使用注释的抽象类的方法中按id注入_Java_Spring - Fatal编程技术网

Java 在使用注释的抽象类的方法中按id注入

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

我想知道是否有可能使用注释再现这种xml代码的和平:

<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);
    }
}