Spring注释 - 注入对象的映射

时间:2016-10-06 22:10:05

标签: java spring

使用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);        
}

2 个答案:

答案 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方法中看到任何问题。但我会选择前者作为清洁工。