这是地图
@Autowired private Mapconverters;
和 ISendableConverter
public interface ISendableConverter { ISendableMsg convert(BaseMessage baseMessage); String getType(); }
有几个类实现 ISendableConverter
我想converters
通过使用spring Autowried 将它们注入变量.
类的实例作为值,方法的结果@Autowried
作为键.
像这个
@Component public class SendableVoiceMsgConverter implements ISendableConverter { @Override public ISendableMsg convert(BaseMessage baseMessage) { // TODO Auto-generated method stub return null; } @Override public String getType() { return "VOICE"; } }
这可能吗?如何?
尝试这样的东西,它适合我
private Map<String, ISendableConverter> converters; @Autowired public void setUploadServices(Set<ISendableConverter> converters){ this.conveters = converters.stream() .collect(Collectors.toMap(ISendableConverter::getType, Function.identity())); }
使用构造函数注入可以实现相同的结果:
private Map<String, ISendableConverter> converters; @Autowired public Foo(Set<ISendableConverter> converters) { this.conveters = converters.stream() .collect(Collectors.toMap(ISendableConverter::getType, Function.identity())); }
你可以这样做:
@SuppressWarnings("unused") private List<OneTypeImageLoader> imageLoaders; private Map<String, OneTypeImageLoader> imageLoaderMap=new HashMap<>(); @Autowired public void setImageLoaders(List<OneTypeImageLoader> imageLoaders) { this.imageLoaders = imageLoaders; imageLoaders.forEach(l-> { imageLoaderMap.put(l.getType(), l); }); }
您可以使用Spring Java配置使用您选择的键自动创建初始化映射:
在带@Configuration
注释的类中注释:
@Autowired private List<ISendableConverter> sendableConverters; @Bean public Map<String, ISendableConverter> sendableConvertersMap() { Map<String, ISendableConverter> sendableConvertersMap = new HashMap<>(); for (ISendableConverter converter : sendableConverters) { sendableConvertersMap.put(converter.getType(), converter); } return sendableConvertersMap; }
比你注入这张地图:
@Resource() private Map<String, ISendableConverter> sendableConverters;
@Resource
如果已定义更多相同类型的地图,则可以选择将一些选择器字符串添加到注释中.
这样你所要做的就是ISendableConverter
用你的spring bean 实现它,它将自动出现在上面定义的Map中.您无需为每个实现手动创建地图项.
试试像@Resource这样的东西- 我还没有测试过这段代码.
@Resource(name="converters") private Map<String, ISendableConverter> converters;
要么
@Value("#{converters}") private Map<String, ISendableConverter> converters;
来自Spring Docs
(..)自身定义为集合或映射类型的bean不能通过@Autowired注入,因为类型匹配不适用于它们.对这样的bean 使用@Resource,通过唯一名称引用特定的集合或映射bean.
这应该有效,只有你准备这样的converters
bean:
<util:map id="converters" scope="prototype" map-class="java.util.HashMap" key-type="java.lang.String" value-type="...ISendableConverter"> <entry key="VOICE" value="sendableVoiceMsgConverter" /> </util:map>
这也是类似的问题:
使用util模式自动连接List会产生NoSuchBeanDefinitionException
Spring无法自动装配Map bean