복붙노트

[SPRING] @Autowired Map을 만들 수 있습니까?

SPRING

@Autowired Map을 만들 수 있습니까?

여기지도가 있습니다.

@Autowired
private Map<String, ISendableConverter> converters;

및 SendableConverter

public interface ISendableConverter {

    ISendableMsg convert(BaseMessage baseMessage);

    String getType();
}

ISendableConverter를 구현하는 몇 가지 클래스가 있습니다.

나는 Autowired 봄을 사용하여 변수 변환기에 그들을 주입 싶어요.

값으로서의 클래스의 인스턴스, 및 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";
    }
}

이것이 가능한가? 그리고 어떻게?

해결법

  1. ==============================

    1.@Resource와 같은 것을 시도해 본다 - 나는이 코드를 테스트하지 않았다.

    @Resource와 같은 것을 시도해 본다 - 나는이 코드를 테스트하지 않았다.

    @Resource(name="converters")
    private Map<String, ISendableConverter> converters;
    

    또는

    @Value("#{converters}")
    private Map<String, ISendableConverter> converters;
    

    Spring 문서에서

    다음과 같이 변환기 빈을 준비해야만 작동합니다.

    <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>
    

    이것은 비슷한 질문입니다.

  2. ==============================

    2.당신은 다음과 같이 할 수 있습니다 :

    당신은 다음과 같이 할 수 있습니다 :

    @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);
        });
    }
    
  3. ==============================

    3.이런 식으로 해봐, 나에게 효과적이야.

    이런 식으로 해봐, 나에게 효과적이야.

    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()));
    }
    
  4. ==============================

    4.Spring Java 구성을 사용하여 원하는 키를 사용하여 자동으로 초기화 된 맵을 만들 수 있습니다.

    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 주석에 선택기 문자열을 추가 할 수 있습니다.

    이렇게하면 Spring bean에 의해 ISendableConverter가 구현되고 위 정의 된 Map에 자동으로 나타납니다. 각 구현에 대해 수동으로 맵 항목을 만들 필요가 없습니다.

  5. from https://stackoverflow.com/questions/20918825/can-spring-autowired-map by cc-by-sa and MIT license