Java& Spring Bean:创建一个包含多种通用类型的bean

时间:2016-10-12 14:01:36

标签: java xml spring generics spring-bean

有一个类有2种通用类型。

public class GenericDao<T, ID extends Serializable> implements IGenericDao<T, ID> {
...
}

我需要从春天开始。

<bean id="myDao" class="com.xxx.yyy.GenericDao">
    <qualifier type="com.xxx.yyy.Item"/> <!-- Works for T -->
    <!-- Need something for ID -->
    ...
    <property name="name" ref="value"/>
    <property name="name" ref="value"/>
</bean>

使用限定符标记我可以处理 T 。我还需要处理 ID

1 个答案:

答案 0 :(得分:0)

你做错了什么。 @Qualifier as well as <qualifier>用于注入bean的依赖项。但是你不是在你的bean中注入任何东西而不是在任何地方注入你的bean,你只是试图定义 bean。

在您的情况下,重要的是要了解在xml中您定义 bean将在运行时实例化。在运行时,擦除了泛型类型:type erasure

那就说你可以给Spring提供的泛型类型/提示并不重要,因为在运行时它将完全无用 - 当spring将实例化bean时 - 所有泛型类型信息都将丢失。

如果您有以下内容,那么正确使用限定符标记:

public class MovieRecommender {

  @Autowired
  @Qualifier("main")
  private MovieCatalog movieCatalog;

  // ...
}

和xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-3.0.xsd">

  <context:annotation-config/>

  <bean class="example.SimpleMovieCatalog">
      <qualifier value="main"/>
      <!-- inject any dependencies required by this bean -->
  </bean>

  <bean id="movieRecommender" class="example.MovieRecommender"/>

</beans>

对于后备匹配,bean名称被视为默认限定符值。 您可以阅读更多at the spring docs