外部jar中的Spring依赖注入

时间:2016-08-04 11:16:47

标签: spring spring-integration autowired spring-bean spring-ioc

我有一个正在消耗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;

任何帮助将不胜感激。

2 个答案:

答案 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。