Spring 外部 jar 中的依赖注入
Spring dependency injection in external jar
我有一个正在使用 jar 的项目 A 让我们说 B.jar
(其中 B 是我们项目 A 中用作依赖项的另一个项目),现在有一个 Bean
(有点像Spring-gemfire
缓存),它在地图中保存所有必需的数据。
这个地图 bean 正在被项目使用(在我的项目中作为 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中)。
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
任何帮助将不胜感激。
本身定义为集合或映射类型的 bean 不能通过 @Autowired
注入,因为类型匹配不适用于它们。对此类 bean 使用 @Resource
,通过唯一名称引用特定集合或映射 bean。
参考:beans-property-is-not-setting-from-utillist-object
和Spring doc
简短回答:HashMap
(或任何其他通用容器,如数组或集合)永远不应该是 Spring Bean。
只有业务对象应该是 beans,而不是基础设施容器。
您可以通过围绕您的地图构建自定义对象并注入它来规避此问题。在您的情况下,您应该注入 foo
bean,并以编程方式从中获取地图。
the @Autowired
section of the manual 中概述了您的情况:
Even typed Maps can be autowired as long as the expected key type is
String. The Map values will contain all beans of the expected type,
and the keys will contain the corresponding bean names:
public class MovieRecommender {
private Map<String, MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
即Spring 认为您需要一个映射,其中键是 bean 名称,值是字符串类型的 bean。
我有一个正在使用 jar 的项目 A 让我们说 B.jar
(其中 B 是我们项目 A 中用作依赖项的另一个项目),现在有一个 Bean
(有点像Spring-gemfire
缓存),它在地图中保存所有必需的数据。
这个地图 bean 正在被项目使用(在我的项目中作为 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中)。
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
任何帮助将不胜感激。
本身定义为集合或映射类型的 bean 不能通过 @Autowired
注入,因为类型匹配不适用于它们。对此类 bean 使用 @Resource
,通过唯一名称引用特定集合或映射 bean。
参考:beans-property-is-not-setting-from-utillist-object
和Spring doc
简短回答:HashMap
(或任何其他通用容器,如数组或集合)永远不应该是 Spring Bean。
只有业务对象应该是 beans,而不是基础设施容器。
您可以通过围绕您的地图构建自定义对象并注入它来规避此问题。在您的情况下,您应该注入 foo
bean,并以编程方式从中获取地图。
the @Autowired
section of the manual 中概述了您的情况:
Even typed Maps can be autowired as long as the expected key type is String. The Map values will contain all beans of the expected type, and the keys will contain the corresponding bean names:
public class MovieRecommender {
private Map<String, MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
即Spring 认为您需要一个映射,其中键是 bean 名称,值是字符串类型的 bean。