복붙노트

[SPRING] Spring과 Abstract 클래스 - 추상 클래스에서 속성 삽입

SPRING

Spring과 Abstract 클래스 - 추상 클래스에서 속성 삽입

Spring ioc 컨테이너에서 주입하고자하는 "mailserver"라는 속성을 가진 추상 기본 클래스가 있습니다. 그러나 추상 클래스의 구체화 된 구현을 실행하면 mailserver 속성에 null이 발생합니다.

이렇게하는 올바른 방법은 무엇입니까? 이런 일을 시도하고 성공 했습니까? 공유하십시오.

안부 인사

해결법

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

    1.추상 속성을 사용하여 추상 기본 클래스 정의를 추상으로 표시하고 구체적인 클래스 정의에서 상위 속성을 추상 클래스의 bean 이름으로 지정합니다.

    추상 속성을 사용하여 추상 기본 클래스 정의를 추상으로 표시하고 구체적인 클래스 정의에서 상위 속성을 추상 클래스의 bean 이름으로 지정합니다.

    이 같은:

    <bean id="abstractBaseClass" abstract="true" class="pacakge1.AbstractBaseClass">
      <property name="mailserver" value="DefaultMailServer"/>
    </bean>
    
    <bean id="concreteClass1" class="pacakge1.ConcreteClass1" parent="abstractBaseClass">     
      <!--Override the value of the abstract based class if necessary-->
      <property name="mailserver" value="AnotherMailServer"/>
    </bean>
    
  2. ==============================

    2.추상적이거나 그렇지 않은 수퍼 클래스의 속성은 Spring의 다른 속성과 똑같이 주입됩니다. XML, 주석 또는 Java 구성을 기반으로 setter, 생성자 또는 필드 주입을 사용할 수 있습니다. Spring 전역에서 상속을 광범위하게 사용할 수 있습니다 (예 : DefaultMessageListenerContainer). 재산을 연결하는 방법을 보여주고 다른 사람이 왜 재산이 작동하지 않는지 설명해 줄 수 있습니다.

    추상적이거나 그렇지 않은 수퍼 클래스의 속성은 Spring의 다른 속성과 똑같이 주입됩니다. XML, 주석 또는 Java 구성을 기반으로 setter, 생성자 또는 필드 주입을 사용할 수 있습니다. Spring 전역에서 상속을 광범위하게 사용할 수 있습니다 (예 : DefaultMessageListenerContainer). 재산을 연결하는 방법을 보여주고 다른 사람이 왜 재산이 작동하지 않는지 설명해 줄 수 있습니다.

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

    3.제 경우에는 스프링 4 애플리케이션에서 고전적인 추상 팩터 리 패턴 (http://java-design-patterns.com/patterns/abstract-factory/에서 아이디어를 가져 와서 각각 인스턴스를 생성해야만했습니다)을 사용해야했습니다. 그리고 때마다 작업이 완료되었습니다. 그래서 내 코드는 다음과 같이 설계되었습니다.

    제 경우에는 스프링 4 애플리케이션에서 고전적인 추상 팩터 리 패턴 (http://java-design-patterns.com/patterns/abstract-factory/에서 아이디어를 가져 와서 각각 인스턴스를 생성해야만했습니다)을 사용해야했습니다. 그리고 때마다 작업이 완료되었습니다. 그래서 내 코드는 다음과 같이 설계되었습니다.

    public abstract class EO {
        @Autowired
        protected SmsNotificationService smsNotificationService;
        @Autowired
        protected SendEmailService sendEmailService;
        ...
        protected abstract void executeOperation(GenericMessage gMessage);
    }
    
    public final class OperationsExecutor {
        public enum OperationsType {
            ENROLL, CAMPAIGN
        }
    
        private OperationsExecutor() {
        }
    
        public static Object delegateOperation(OperationsType type, Object obj) 
        {
            switch(type) {
                case ENROLL:
                    if (obj == null) {
                        return new EnrollOperation();
                    }
                    return EnrollOperation.validateRequestParams(obj);
                case CAMPAIGN:
                    if (obj == null) {
                        return new CampaignOperation();
                    }
                    return CampaignOperation.validateRequestParams(obj);
                default:
                    throw new IllegalArgumentException("OperationsType not supported.");
            }
        }
    }
    
    @Configurable(dependencyCheck = true)
    public class CampaignOperation extends EO {
        @Override
        public void executeOperation(GenericMessage genericMessage) {
            LOGGER.info("This is CAMPAIGN Operation: " + genericMessage);
        }
    }
    

    처음에는 추상 클래스에 종속성을 주입하기 위해 @Component, @Service 등의 모든 스테레오 타입 주석을 시도했지만 스프링 컨텍스트 파일에는 전체 패키지에 대해 ComponentScanning이 있었지만 CampaignOperation과 같은 하위 클래스 인스턴스를 생성하는 동안 Super Abstract 클래스 EO는 Spring이 그 의존성을 인식하고 삽입 할 수 없기 때문에 그 속성을 null로 가지는 것은 많은 시행 착오 끝에 ** Configurable (dependencyCheck = true) ** annotation을 사용했고 결국 Spring은 의존성을 주입 할 수 있었고 속성을 너무 많이 사용하지 않고 하위 클래스의 속성을 사용하십시오.

    <context:annotation-config />
    <context:component-scan base-package="com.xyz" />
    

    또한 해결책을 찾기 위해 다음 참조를 시도했습니다.

    ** @ Configurable (dependencyCheck = true) **을 사용해 보시고이 게시물을 업데이트하십시오. 문제가 발생할 경우 도와 드리겠습니다.

  4. from https://stackoverflow.com/questions/7184556/spring-and-abstract-class-injecting-properties-in-abstract-classes by cc-by-sa and MIT license