복붙노트

[SPRING] 추상 클래스에 정의 된 스프링 autowire 의존성

SPRING

추상 클래스에 정의 된 스프링 autowire 의존성

나는 @Autowired 의존성을 갖는 추상 클래스 "Command"와 추상 클래스를 확장하는 클래스들을 가지고있다. 종속성이 주입되지 않습니다. 추상적이고 구체적인 클래스는 @Component로 주석을 달고 스캔됩니다. 기본 (추상) 클래스는 스프링 관리되지 않는 것 같습니다. 그것이되기 위해서 무엇을해야합니까? 추상적으로 정의 할 주석이 있습니까? 나는 XML로 빈을 정의하고 싶지 않다.

public abstract class Command {
  @Autowired
  private SecurityUtils securityUtils;
....

@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
@Component
public class NoteCommand extends Command {
...
}

나의 실수는 사과한다. 명령 클래스는 내 컨트롤러에 주입되고 그 중 하나 (NoteCommand)가 "new"를 통해 수동으로 인스턴스화됩니다. 모두 좋은.

해결법

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

    1.이는 XML 구성 (주석에 대해 확실하지 않음)을 통해 이루어질 수 있습니다. 읽기 http://docs.spring.io/spring-framework/docs/3.0.0.RC3/reference/html/ch03s07.html

    이는 XML 구성 (주석에 대해 확실하지 않음)을 통해 이루어질 수 있습니다. 읽기 http://docs.spring.io/spring-framework/docs/3.0.0.RC3/reference/html/ch03s07.html

    이것을 시도해보십시오 (자식 빈에 다른 설정을 추가 하시겠습니까?).

    <bean id = "command" class = "some.package.name.Command" abstract = "true">
      <property name = "securityUtils" ref = "securityUtils"/>
    </bean>
    
    <bean id ="noteCommand" class = "some.package.name.NoteCommand" parent="commadn">
    
    </bean>
    

    건배!

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

    2.제 경우에는 스프링 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) **을 사용해 보시고이 게시물을 업데이트하십시오. 문제가 발생할 경우 도와 드리겠습니다.

  3. from https://stackoverflow.com/questions/19714586/spring-autowire-dependency-defined-in-an-abstract-class by cc-by-sa and MIT license