Java和Spring Bean:创建一个包含多个Generic Types的bean

ufu*_*gun 6 java xml generics spring spring-bean

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

public class GenericDao<T, ID extends Serializable> implements IGenericDao<T, ID> {
...
}
Run Code Online (Sandbox Code Playgroud)

我需要从春天开始.

<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>
Run Code Online (Sandbox Code Playgroud)

预选赛标签我能处理牛逼.我还需要处理ID.

Vad*_*huk 0

你做错了什么。@Qualifier as well as <qualifier>用于注入bean的依赖关系。但是你并没有向你的 bean 中注入任何东西,也没有在任何地方注入你的 bean,你只是试图定义bean。

对于您的情况,重要的是要了解在 xml 中您正在定义将在运行时实例化的 bean 。并且在运行时泛型类型被擦除:类型擦除

也就是说,无论您可以向 Spring 提供什么泛型类型/提示,它都将完全无用,因为在运行时(当 spring 实例化 bean 时),所有泛型类型信息都将丢失。

限定符标签的正确用法是:

public class MovieRecommender {

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

  // ...
}
Run Code Online (Sandbox Code Playgroud)

和 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>
Run Code Online (Sandbox Code Playgroud)

对于后备匹配,bean 名称被视为默认限定符值。您可以在 spring 文档中阅读更多内容