programing

봄은 추상적인 수업 안에서 자동 학습할 수 있나요?

golfzon 2023. 4. 4. 22:40
반응형

봄은 추상적인 수업 안에서 자동 학습할 수 있나요?

봄은 내 물건의 자동 전원에 실패한다?추상 클래스 내에서 객체를 자동 연결할 수 있습니까?모든 스키마가 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-syslog.xml

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

난 그런 스프링 장치가 작동중이야

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

public abstract class AbstractJobRoute extends RouteBuilder {

    @Autowired
    private GlobalSettingsService settingsService;

그리고 몇 명의 아이들이@Component주석입니다.

일반적으로 추상 클래스가 컴포넌트 스캔용으로 제공된 기본 패키지에 포함되어 있는 한 스프링이 자동 배선을 수행합니다.

자세한 것은, 이것과 이것을 참조해 주세요.

@Service그리고.@Component두 가지 고정관념 모두 스프링 용기 안에 주석이 달린 유형의 콩을 만듭니다.Spring Docs 상태로서

이 주석은 @Component의 특화 기능으로 기능하며 클래스 패스스캔을 통해 구현 클래스를 자동 검출할 수 있습니다.

에서 데이터베이스 조작이 필요한 경우SuperGirl당신은 그것을 다시 주입할 것이다.SuperGirl.

다른 클래스에서 동일한 오브젝트 참조를 사용하는 것이 주요 아이디어라고 생각합니다.그럼 이건 어떨까요?

//There is no annotation about Spring in the abstract part.
abstract class SuperMan {


    private final DatabaseService databaseService;

    public SuperMan(DatabaseService databaseService) {
     this.databaseService = databaseService;
    }

    abstract void Fly();

    protected void doSuperPowerAction(Thing thing) {

        //busy code

        databaseService.save(thing);

    }
}

@Component
public class SuperGirl extends SuperMan {

private final DatabaseService databaseService;

@Autowired
public SuperGirl (DatabaseService databaseService) {
     super(databaseService);
     this.databaseService = databaseService;
    }

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

public doSomethingSuperGirlDoes() {

    //busy code

    doSuperPowerAction(thing)

}

내 생각에는 모든 곳에 한 번 실행되도록 주입한다:)

제 경우 Spring4 어플리케이션 내에서 작업을 수행할 때마다 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는 스프링이 종속성을 인식하고 주입할 수 없었기 때문에 속성에 대해 null을 가지고 있었습니다.많은 시행착오 끝에 이것을 사용했다**@Configurable(dependencyCheck = true)**주석과 마침내 스프링은 종속성을 주입할 수 있었고, 너무 많은 속성을 수반하지 않고 서브클래스의 속성을 사용할 수 있었습니다.

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

해결책을 찾기 위해 다음과 같은 참고 자료도 시도했습니다.

  1. http://www.captaindebug.com/2011/06/implementing-springs-factorybean.html #.WqF5pJPWAAN
  2. http://forum.spring.io/forum/spring-projects/container/46815-problem-with-autowired-in-abstract-class
  3. https://github.com/cavallefano/Abstract-Factory-Pattern-Spring-Annotation
  4. http://www.jcombat.com/spring/factory-implementation-using-servicelocatorfactorybean-in-spring
  5. https://www.madbit.org/blog/programming/1074/1074/ #sthash.XEJXdIR5.dpbs
  6. 스프링 프레임워크에 추상 팩토리 사용
  7. 스프링 자동 배선이 Abstract 클래스에 대해 작동하지 않습니다.
  8. 추상 슈퍼클래스에 스프링 의존성
  9. 스프링 및 추상 클래스 - 추상 클래스에 속성 주입
    1. 추상 클래스에서 정의된 스프링 자동 배선 종속성

사용해보시기 바랍니다.**@Configurable(dependencyCheck = true)**이 게시물을 업데이트하면 문제가 생기면 제가 도와드리겠습니다.

언급URL : https://stackoverflow.com/questions/19965829/spring-can-you-autowire-inside-an-abstract-class

반응형