我有一个正在消耗jar的项目A让我们说B.jar
(其中B是我们项目A中用作依赖项的另一个项目),现在有一个Bean
(一种{ {1}}缓存),它包含地图中的所有必需数据。
这个map bean正在被项目使用(在我的项目中包含为Spring-gemfire
),即B来读取缓存属性,但我无法提供任何帮助吗?
我的项目B的webapp-config.xml
jar
上面的bean b2必须在外部项目B中使用(在我的项目A中包含为jar)。
clas sin project B2的一部分
<!-- 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>
但我正在
@Autowired
@Qualifier("b2")
private Map<String, String> mapFromA;
任何帮助将不胜感激。
答案 0 :(得分:0)
本身定义为集合或地图类型的Bean无法通过@Autowired
注入,因为类型匹配不适用于它们。对此类bean使用@Resource
,以唯一名称引用特定集合或映射bean。
参考:beans-property-is-not-setting-from-utillist-object
和春天doc
答案 1 :(得分:0)
简短回答:HashMap
(或任何其他通用容器,如数组或集合)永远不应该是Spring Bean。
只有业务对象应该是bean,而不是基础架构容器。
您可以通过在地图周围构建自定义对象并注入此内容来规避此问题。在您的情况下,您应该注入foo
bean,并以编程方式从中获取地图。
在您的情况下,the @Autowired
section of the manual中的概述是
只要预期的密钥类型是,即使是类型化的地图也可以自动装配 串。 Map值将包含预期类型的所有bean, 并且键将包含相应的bean名称:
public class MovieRecommender {
private Map<String, MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
即。 Spring认为你想要一个映射,其中键是bean名称,值是bean类型的bean。