Инжекция пружинной зависимости во внешнюю банку
У меня есть проект А, который потребляет банку, скажем, B.jar
(где B - другой проект, используемый в качестве зависимости в нашем проекте A), теперь есть Bean
(вид Spring-gemfire
кеш), который содержит все необходимые данные на карте. Этот бин карты используется проектом (включен как jar
в моем проекте) т.е. B, чтобы прочитать свойства кэша, но я не могу сделать так, чтобы помочь?
мой webapp-config.xml для проекта B
<!-- Injecting bean in our A application -->
<bean id="foo" class="com.abc.solutions.Foo" init-method="loadFoo">
<property name="bar1" ref="gemFireBean"/>
<property name="bar2" ref="commonBean"/>
</bean>
<bean id="b2" class="java.util.HashMap"
factory-bean="foo" factory-method="createB2" autowire="byName">
</bean>
вышеупомянутый bean-компонент b2 должен использоваться во внешнем проекте B (включен как jar в мой проект A).
часть проекта clas sin B2
@Autowired
@Qualifier("b2")
private Map<String, String> mapFromA;
но я получаю
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency
любая помощь будет оценена.
2 ответа
Краткий ответ: HashMap
(или любой другой универсальный контейнер, такой как массивы или коллекции) никогда не должен быть Spring Bean. Только бизнес-объекты должны быть компонентами, а не контейнерами инфраструктуры.
Вы можете обойти это, создав собственный объект вокруг вашей карты и добавив его. В вашем случае вы должны ввести свой foo
бин, и получить карту от него программно.
То, что происходит в вашем случае, изложено в @Autowired
раздел руководства:
Даже набранные карты могут быть подключены автоматически, если ожидаемый тип ключа - String. Значения Map будут содержать все bean-компоненты ожидаемого типа, а ключи будут содержать соответствующие имена bean-компонентов:
public class MovieRecommender {
private Map<String, MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
Т.е. Spring думает, что вам нужна карта, где ключами являются имена бинов, а значения - бины типа string.
Бины, которые сами определены как тип коллекции или карты, не могут быть внедрены через @Autowired
потому что сопоставление типов не относится к ним должным образом. использование @Resource
для таких bean-компонентов - ссылка на конкретный bean-компонент коллекции или карты с уникальным именем.
см.: bean-свойство-свойство-не-установка-от-объекта-объекта
и весенний док