[SPRING] 제네릭 매개 변수 별 싱글 톤 인스턴스
SPRING제네릭 매개 변수 별 싱글 톤 인스턴스
단일 @Component 제네릭 클래스를 기반으로 제네릭 매개 변수로 싱글 톤 빈 인스턴스를 만들고 싶습니다.
(나는 봄 4를 사용하고있다.)
내 코드 :
다음과 같은 인터페이스가 있습니다.
public interface Mapper<I, O> {
...
}
그리고 Spring @Components (singletons) 인 다중 구현. 이 같은 :
@Component
public class MapperA implements Mapper<ClazzAI, ClazzAO> {
...
}
과
@Component
public class MapperB implements Mapper<ClazzBI, ClazzBO> {
...
}
ClazzAI, ClazzAO, ClazzBI 및 ClazzBO는 기본 Java 클래스입니다.
나는 또 다른 Spring @Component (singleton)을 가지고 있는데, 이것은 Mapper 클래스를 일반적인 매개 변수로 갖는다 :
@Component
public class TransformerImpl<I, O, M extends Mapper<I, O>> {
/** The Mapper */
protected final M mapper;
@Inject
private TransformerImpl(final M mapper) {
this.mapper= mapper;
}
...
}
나는 이것을 다음과 같이 사용하고 싶다.
@Inject
private TransformerImpl<ClazzAI, ClazzAO, MapperA> transformerA;
@Inject
private TransformerImpl<ClazzBI, ClazzBO, MapperB> transformerB;
문제 :
그러나 Spring은이 두 객체를 인스턴스화 할 수 없습니다. 왜냐하면 어떤 구현을 일반 매개 변수로 지정하더라도 Mapper : MapperA 및 MapperB의 두 구현을 발견했기 때문입니다.
@Configuration 클래스에있는 모든 빈을 인스턴스화 할 필요없이 어떻게 만들 수 있을지 궁금하십니까?
해결법
-
==============================
1.싱글 톤을 요구하고 있지만 2 개의 주입 지점이 필요합니다.
싱글 톤을 요구하고 있지만 2 개의 주입 지점이 필요합니다.
@Inject private TransformerImpl<ClazzAI, ClazzAO, MapperA> transformerA; @Inject private TransformerImpl<ClazzBI, ClazzBO, MapperB> transformerB;
다르게 구성된 오브젝트의 경우. 그건별로 의미가 없습니다.
이제 두 개의 콩이 필요하다는 것을 알게되었습니다. @Bean 팩토리 메서드를 사용하여 @Configuration 클래스에서이 작업을 수행 할 수 없다면 @Component 클래스를 별도로 선언하고 스캔해야합니다. (부모 생성자를 여기 공개했습니다.)
@Component class MapperATransformerImpl extends TransformerImpl<ClazzAI, ClazzAO, MapperA> { @Inject public MapperATransformerImpl(MapperA mapper) { super(mapper); } } @Component class MapperBTransformerImpl extends TransformerImpl<ClazzBI, ClazzBO, MapperB> { @Inject public MapperBTransformerImpl(MapperB mapper) { super(mapper); } }
분사 목표를 처리 할 때
@Inject private TransformerImpl<ClazzAI, ClazzAO, MapperA> transformerA;
Spring은 TransformerImpl
타입의 MapperATransformerImpl을 찾아서 삽입 할 것입니다. -
==============================
2.Spring 4를 사용해보십시오. autowiring 한정자로 제네릭 사용하기를 참조하십시오.
Spring 4를 사용해보십시오. autowiring 한정자로 제네릭 사용하기를 참조하십시오.
편집하다
@SotiriosDelimanolis과 마찬가지로 @SotiriosDelimanolis는 특정 주입 점과 일치하는 bean 정의를 선택하는 한정자로 형식 매개 변수 정보를 사용할 수 있지만 결국에는 bean 정의와 구체적인 유형 정의 만 일치시킵니다. 귀하의 경우, 문제는 주입하려는 각 구체적인 유형에 대해 TransformerImpl Bean 정의가 필요하다는 것입니다.
모든 bean 정의를 명시 적으로 정의하는 대신에, paramaterized 클래스에 대한 Spring autowiring 문제에 대한 내 대답을 확인하십시오.
from https://stackoverflow.com/questions/25648414/singleton-bean-instance-by-generic-parameter by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 봄 MVC - 잘못된 날짜에 대한 Joda datetime 오류 메시지 (0) | 2019.02.26 |
---|---|
[SPRING] 이미지 byte []를 Grails의 response.outputStream으로 보내면 "응답이 커밋 된 후에 전달할 수 없습니다" (0) | 2019.02.26 |
[SPRING] 재 연결시 시퀀스의 현재 값이 다음 100으로 넘어갑니다 (0) | 2019.02.26 |
[SPRING] 자바 주석 - 코드 단순화 (0) | 2019.02.25 |
[SPRING] CXF 클라이언트 : 요청한 대상에 대한 유효한 인증 경로를 찾을 수 없습니다. (0) | 2019.02.25 |