복붙노트

[SPRING] Spring은 추상 클래스 내에서 autowire 할 수 있습니까?

SPRING

Spring은 추상 클래스 내에서 autowire 할 수 있습니까?

봄이 내 물건을 autowire에 실패하고 있습니까? 추상 클래스 내에서 객체를 autowire 할 수 있습니까? 모든 스키마가 application-context.xml에 제공된다고 가정합니다.

질문 : 기본 클래스 및 확장 클래스 (있는 경우)에 어떤 주석을 사용해야합니까 @Service @Component?

abstract class SuperMan {

    @Autowire
    private DatabaseService databaseService;

    abstract void Fly();

    protected void doSuperPowerAction(Thing thing) {

        //busy code

        databaseService.save(thing);

    }
}

확장 클래스

public class SuperGirl extends SuperMan {

    @Override
    public void Fly() {
        //busy code
    }

    public doSomethingSuperGirlDoes() {

        //busy code

        doSuperPowerAction(thing)

    }

application-context.xml

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

해결법

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

    1.일반적으로 Spring은 컴포넌트 클래스 스캔을 위해 제공되는 기본 패키지에 추상 클래스가있는 한 autowiring을 수행해야한다.

    일반적으로 Spring은 컴포넌트 클래스 스캔을 위해 제공되는 기본 패키지에 추상 클래스가있는 한 autowiring을 수행해야한다.

    자세한 내용은이 내용과이 부분을 참조하십시오.

    @Service와 @Component는 Spring 컨테이너 내부에 주석 유형의 빈을 만드는 스테레오 타입이다. 스프링 문서 (Spring Docs)

  2. ==============================

    2.그런 종류의 스프링 설치가 작동합니다.

    그런 종류의 스프링 설치가 작동합니다.

    자동 필드가있는 추상 클래스

    public abstract class AbstractJobRoute extends RouteBuilder {
    
        @Autowired
        private GlobalSettingsService settingsService;
    

    @Component 주석으로 정의 된 여러 어린이.

  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 등의 모든 스테레오 타입 주석을 시도했지만 Spring 컨텍스트 파일에는 전체 패키지에 대해 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/19965829/spring-can-you-autowire-inside-an-abstract-class by cc-by-sa and MIT license