Java и Spring Bean: создание компонента с несколькими универсальными типами

#java #xml #spring #generics #spring-bean

#java #xml #spring #общие #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. Какие свойства вы пытаетесь автоматически подключить с помощью квалификатора?

2. T — это класс, который я буду хранить в базе данных. ID — это первичный ключ, который может меняться для каждого класса. (Идентификатор обычно длинный)

Ответ №1:

Вы делаете что-то не так. @Qualifier as well as <qualifier> предназначены для внедрения зависимостей компонентов. Но вы ничего не вводите в свой компонент и никуда не вводите свой компонент, вы просто пытаетесь определить компонент.

В вашем случае важно понимать, что в xml вы определяете компоненты, которые будут созданы во время выполнения. И во время выполнения общие типы удаляются: удаление типа

При этом не имеет значения, какие универсальные типы / подсказки вы можете предоставить Spring, это будет совершенно бесполезно во время выполнения — когда spring создаст экземпляр beans — вся информация об общих типах будет потеряна.

Правильное использование тега-квалификатора было бы, если бы у вас:

 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>
  

Для резервного сопоставления имя компонента считается значением квалификатора по умолчанию.
Вы можете прочитать больше в spring docs