使用XML注释,我使用下面的配置注入地图 -
<bean id = "customerfactory" class = "com.brightstar.CustomerFactory">
<property name = "getCustomerMap">
<map key-type = "java.lang.String" value-type = "com.brightstar.CustomerImpl">
<entry key = "DEFAULT" value-ref = "getDefaultImpl"></entry>
<entry key = "PERSON" value-ref = "getPersonImpl"></entry>
<entry key = "COMPANY" value-ref = "getCompanyImpl"></entry>
</map>
</property>
</bean>
我创建了3个bean - DefaultImpl,PersonImpl和CompanyImpl。如何使用Spring Annotation将这些作为地图注入?
编辑:目前,我已执行以下操作,但不确定是否为推荐方法
private Map<String, CustomerImpl> getCustomerMap ;
@Autowired
private GetDefaultImpl getDefaultImpl;
@Autowired
private GetPersonImpl getPersonImpl;
@Autowired
private GetCompanyImpl getCompanyImpl;
private static final String DEFAULT = "DEFAULT";
private static final String COM = "PERSON";
private static final String SOM = "COMPANY";
@PostConstruct
public void init(){
getCustomerMap = new LinkedHashMap<String,CustomerImpl>();
getCustomerMap.put(DEFAULT, getDefaultImpl);
getCustomerMap.put(PERSON, getPersonImpl);
getCustomerMap.put(COMPANY, getCompanyImpl);
}
答案 0 :(得分:4)
1.注入包含对象的地图,(使用Java配置)
你可以这样做......
@Configuration
public class MyConfiguration {
@Autowired private WhiteColourHandler whiteColourHandler;
@Bean public Map<ColourEnum, ColourHandler> colourHandlers() {
Map<ColourEnum, ColourHandler> map = new EnumMap<>();
map.put(WHITE, whiteColourHandler);
//put more objects into this map here
return map;
}
}
====================
2.注入包含字符串的地图(使用属性文件)
您可以使用 @Value 注释和 SpEL 将字符串值从属性文件注入到地图中。
例如,属性文件中的属性。
propertyname={key1:'value1',key2:'value2',....}
在您的代码中,
@Value("#{${propertyname}}")
private Map<String,String> propertyname;
注意: 1.标签作为注释的一部分。
2.Values must be quotes, else you will get SpelEvaluationException
答案 1 :(得分:1)
加我2美分。据我所知,您正在实现工厂模式,在运行时在实现之间切换。因此,它是代码,而不是配置,是代码本身的理想位置,而不是属性文件。我会采用Sundararaj Govindasamy建议的第一种方法。我也没有在@postConstruct方法中看到任何问题。但我会选择前者作为清洁工。