#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