Ste*_*iks 8 java spring ioc-container
我正在使用Spring 3.0.4.我有一些在地图上使用@Autowired注释的bean.这些映射在application-context.xml文件中定义(因为这些映射是使用多个工厂方法构造的).
当我使用我的调试器时,我可以看到使用正确的(预期的)bean id构建映射.但是,一旦自动装配过程开始,它声称它找不到具有刚刚创建的id的bean.
一段代码:
@Autowired
@Qualifier("dienstverbandMap")
private Map<String, String> dienstverbandMap;
Run Code Online (Sandbox Code Playgroud)
一段上下文xml:
<bean class="java.util.HashMap" id="dienstverbandMap" factory-bean="someFactoryMethod" factory-method="getMappedMap"/>
Run Code Online (Sandbox Code Playgroud)
重要的细节,当我在我的类和上下文xml中将类型更改为java.lang.Object时,它确实已经连接了实际上,我可以将其转换为代码中的HashMap并使一切正常工作.但这显然不是我想要的.
有人解释我做错了吗?
Quote:如果您打算按名称表达注释驱动注入,请不要主要使用@Autowired - 即使技术上能够通过@Qualifier值引用bean名称.相反,更喜欢JSR-250 @Resource注释,该注释在语义上定义为通过其唯一名称标识特定目标组件,声明的类型与匹配过程无关.
作为这种语义差异的特定结果,自身定义为集合或映射类型的bean不能通过@Autowired注入,因为类型匹配不适用于它们.对这样的bean使用@Resource,通过唯一名称引用特定的collection/map bean.
我认为这与 的类型参数有关dienstverbandMap。只有当 Spring 能够确定 bean 实例 (a HashMap) 实际上被实例化为 a 时,注入才能安全地执行HashMap<String, String>。Spring 可能会丢失类型参数,因为 bean 的声明类型是原始类型。
另一种可能是工厂方法的结果签名错误;例如,Map 而不是 HashMap,或者原始 HashMap 而不是HashMap<String, String>.
(如果您向我们展示工厂方法的声明,其中一些理论可能会被反驳。)
顺便说一句,根据 spring-beans 2.0 DTD 和 3.0 XSD 中的注释,class如果您提供属性,则不会使用该属性factory-bean。您是否尝试过完全忽略它?
| 归档时间: |
|
| 查看次数: |
4790 次 |
| 最近记录: |