복붙노트

[SPRING] Spring Java Configuration - enum에서 bean으로의 참조를 만드는 방법 - 참조

SPRING

Spring Java Configuration - enum에서 bean으로의 참조를 만드는 방법 - 참조

자바 기반의 구성으로, enum을 빈 참조로 매핑하는 맵을 순수 자바 구성 (현재 XML 및 작동 중)에 있도록 변환하려고 시도하고 있지만 문서에서 아무것도 찾을 수없는 것 같습니다.

현재, 내 XML 그렇게;

<util:map id="colourHanders" key-type="com.example.ColourEnum"
          value-type="com.example.ColourHandler">
    <entry key="white" value-ref="whiteColourHandler"/>
    <entry key="blue" value-ref="blueColourHandler"/>
    <entry key="red" value-ref="redColourHandler"/>
</util:map>

나는 그것이 쉽지만 다시 Pure Java에서 이것을 표현하는 방법에 관한 주제를 찾을 수 없다 (그래서 나는 XML 설정 파일이 없다).

노트; ColourHandler 빈은 @Component 주석을 사용하여 생성됩니다 (예 : ..).

@Component
public class RedColourHandler implements ColourHander{
.....
}

colourHandlers의 맵은 그렇게 참조됩니다.

@Resource(name="colourHandlers")
    private Map<ColourHandlerEnum, ColourHandler> colourHandlers;

감사,

이안.

해결법

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

    1.아마도 다음과 같은 것을 원할 것입니다 :

    아마도 다음과 같은 것을 원할 것입니다 :

    @Configuration
    public class MyConfiguration {
        @Bean public Map<ColourEnum, ColourHandler> colourHandlers() {
            Map<ColourEnum, ColourHandler> map = new EnumMap<>();
            map.put(WHITE, whiteHandler());
            // etc
            return map;
        }
    
        @Bean public ColourHandler whiteHandler() {
            return new WhiteHandler();
        }
    }
    

    핸들러를 @Components로 유지해야하는 경우 구성 클래스에 자동 핸들링 할 수 있습니다.

    @Configuration
    public class MyConfiguration {
        @Autowired private WhiteColourHandler whiteColourHandler;
    
        @Bean public Map<ColourEnum, ColourHandler> colourHandlers() {
            Map<ColourEnum, ColourHandler> map = new EnumMap<>();
            map.put(WHITE, whiteColourHandler);
            return map;
        }
    }
    
  2. ==============================

    2.이것은 실제로 매우 간단하지만 어떻게 알아야합니다.

    이것은 실제로 매우 간단하지만 어떻게 알아야합니다.

     @Autowired private ColourHandler whiteColourHandler;
     ...
    
     public Map<ColourEnum, ColourHandler> getColourHander() {
         Map<ColourEnum, ColourHandler> result = ...;
         map.put( ColourEnum.white, whiteColourHandler );
         ...
         return map;
     }
    

    비법은 콩을 설정에 삽입 할 수 있다는 것입니다.

  3. ==============================

    3.허용 된 응답을 제외하고, 컴포넌트를 자동 와이어 링하는 대신, 평소와 같이 구성 클래스에서 Bean을 선언하고이를 Map Bean 메소드에 인수로 전달할 수 있습니다.

    허용 된 응답을 제외하고, 컴포넌트를 자동 와이어 링하는 대신, 평소와 같이 구성 클래스에서 Bean을 선언하고이를 Map Bean 메소드에 인수로 전달할 수 있습니다.

    @Configuration
    public class MyConfiguration {
        @Bean public Map<ColourEnum, ColourHandler> colourHandlers(ColourHandler whiteHandler) {
            Map<ColourEnum, ColourHandler> map = new EnumMap<>();
            map.put(WHITE, whiteHandler);
            return map;
        }
    
        @Bean public ColourHandler whiteHandler() {
            return new WhiteHandler();
        }
    }
    

    또한 @Resource로 맵을 삽입 할 때 필드 이름이 Bean 정의와 동일한 명명 규칙을 따르는 경우 주석의 "name"매개 변수는 필요하지 않습니다.

    즉 이것은 name 매개 변수없이 작동합니다.

    @Resource
    private Map<ColourHandlerEnum, ColourHandler> colourHandlers;
    

    그러나 이것은 그것을 요구할 것이다 :

    @Resource(name="colourHandlers")
    private Map<ColourHandlerEnum, ColourHandler> handlers;
    
  4. ==============================

    4.각 ColorHandler에 대해 고유 한 클래스 / @ Component를 이미 가지고 있기 때문에 Spring이 사용할 것을 알아낼 수 있습니다 (@Autowire 삽입이나 추가 생성 메소드가 필요 없음).

    각 ColorHandler에 대해 고유 한 클래스 / @ Component를 이미 가지고 있기 때문에 Spring이 사용할 것을 알아낼 수 있습니다 (@Autowire 삽입이나 추가 생성 메소드가 필요 없음).

    @Configuration
    public class MyConfiguration {
        @Bean public Map<ColourEnum, ColourHandler> colourHandlers(
                WhiteColourHandler whiteHandler, 
                BlueColourHandler blueHandler, 
                RedColourHandler redHandler) {
            Map<ColourEnum, ColourHandler> map = new EnumMap<>();
            map.put(WHITE, whiteHandler);
            map.put(BLUE, blueHandler);
            map.put(RED, redHandler);
            return map;
        }
    }
    
  5. from https://stackoverflow.com/questions/13293297/spring-java-configuration-how-do-create-a-map-of-enums-to-beans-references by cc-by-sa and MIT license