[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.@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.당신은 다음과 같이 할 수 있습니다 :
당신은 다음과 같이 할 수 있습니다 :
@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.이런 식으로 해봐, 나에게 효과적이야.
이런 식으로 해봐, 나에게 효과적이야.
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.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에 자동으로 나타납니다. 각 구현에 대해 수동으로 맵 항목을 만들 필요가 없습니다.
from https://stackoverflow.com/questions/20918825/can-spring-autowired-map by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] try catch 블록을 사용할 때 Spring @ Transactional 주석 (0) | 2019.02.01 |
---|---|
[SPRING] JUnit 테스트는 항상 트랜잭션을 롤백합니다. (0) | 2019.02.01 |
[SPRING] <context : include-filter>와 <context : exclude-filter>는 Spring에서 어떻게 작동합니까? (0) | 2019.02.01 |
[SPRING] 스프링 MVC : 경로 변수가 필요한지 여부를 나타내는 방법? (0) | 2019.02.01 |
[SPRING] spring-boot-startter-web을 사용하여 "수용 가능한 표현을 찾을 수 없습니다" (0) | 2019.02.01 |