这是Map
@Autowired
private Map<String, ISendableConverter> converters;
和ISendableConverter
public interface ISendableConverter {
ISendableMsg convert(BaseMessage baseMessage);
String getType();
}
有一些类实现ISendableConverter
我想使用spring@Autowried
注解将它们注入变量converters
。
类的示例作为值,方法getType()
的结果作为键。
就像这个
@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";
}
}
这可能吗?怎么可能?
8条答案
按热度按时间qybjjes11#
您可以使用SpringJava配置创建一个自动初始化的Map,其中包含您选择的键:
在使用
@Configuration
注解注解的类中:然后在Map中注入:
如果您定义了多个相同类型的Map,则可以选择将一些选择器字符串添加到
@Resource
注解中。这样,您只需通过spring bean实现
ISendableConverter
,它就会自动出现在上面定义的Map中,而不需要为每个实现手动创建Map项。lfapxunr2#
尝试使用类似于@Resource的内容-我还没有测试过这段代码。
或
从Spring文档
(..)无法通过@Autowired注入本身定义为集合或Map类型的Bean,因为类型匹配不适用于它们。请对此类Bean使用@Resource,通过唯一名称引用特定的集合或MapBean。
只有在准备
converters
bean时,这才能正常工作:这也是类似的问题:
9bfwbjaz3#
您可以执行以下操作:
uelo1irk4#
试试这样的东西,它对我很有效
使用构造函数注入可以实现相同的结果:
ss2ws0br5#
您可能只想将类型名称直接添加到组件注解中,这样就可以完成任务。
w6mmgewl6#
首先,将Bean名称设置为
getType()
的返回值你可以这样使用:
该MapV类型是Bean的示例,K类型是Bean的名称
nkoocmlb7#
这可以通过
spring-componentmap
(https://github.com/krud-dev/spring-componentmap)来实现根据您的示例:
免责声明:我与他人共同开发了
spring-componentmap
8qgya5xd8#
您可以使其更通用,并构建如下所示的内容:
现在,您可以在代码中的任何地方使用
StrategyMap
,如下所示:这种方法一般化了
StrategyMap
的创建,并且还可以集中化未找到值的情况下的逻辑。PS:当然
ISendableConverter
必须扩展BasicStrategy
接口。