복붙노트

[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. ==============================

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

    2.Spring 4를 사용해보십시오. autowiring 한정자로 제네릭 사용하기를 참조하십시오.

    Spring 4를 사용해보십시오. autowiring 한정자로 제네릭 사용하기를 참조하십시오.

    편집하다

    @SotiriosDelimanolis과 마찬가지로 @SotiriosDelimanolis는 특정 주입 점과 일치하는 bean 정의를 선택하는 한정자로 형식 매개 변수 정보를 사용할 수 있지만 결국에는 bean 정의와 구체적인 유형 정의 만 일치시킵니다. 귀하의 경우, 문제는 주입하려는 각 구체적인 유형에 대해 TransformerImpl Bean 정의가 필요하다는 것입니다.

    모든 bean 정의를 명시 적으로 정의하는 대신에, paramaterized 클래스에 대한 Spring autowiring 문제에 대한 내 대답을 확인하십시오.

  3. from https://stackoverflow.com/questions/25648414/singleton-bean-instance-by-generic-parameter by cc-by-sa and MIT license