[SPRING] Spring은 추상 클래스 내에서 autowire 할 수 있습니까?
SPRINGSpring은 추상 클래스 내에서 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.일반적으로 Spring은 컴포넌트 클래스 스캔을 위해 제공되는 기본 패키지에 추상 클래스가있는 한 autowiring을 수행해야한다.
일반적으로 Spring은 컴포넌트 클래스 스캔을 위해 제공되는 기본 패키지에 추상 클래스가있는 한 autowiring을 수행해야한다.
자세한 내용은이 내용과이 부분을 참조하십시오.
@Service와 @Component는 Spring 컨테이너 내부에 주석 유형의 빈을 만드는 스테레오 타입이다. 스프링 문서 (Spring Docs)
-
==============================
2.그런 종류의 스프링 설치가 작동합니다.
그런 종류의 스프링 설치가 작동합니다.
자동 필드가있는 추상 클래스
public abstract class AbstractJobRoute extends RouteBuilder { @Autowired private GlobalSettingsService settingsService;
@Component 주석으로 정의 된 여러 어린이.
-
==============================
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) **을 사용해 보시고이 게시물을 업데이트하십시오. 문제가 발생할 경우 도움을 받으실 수 있습니다.
from https://stackoverflow.com/questions/19965829/spring-can-you-autowire-inside-an-abstract-class by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Tomcat 6에서 Spring 4.0을 배치 할 때의 AbstractMethodError (0) | 2018.12.19 |
---|---|
[SPRING] Spring 부트에서 Yaml의 목록을 객체 목록으로 매핑 (0) | 2018.12.19 |
[SPRING] 석영 : 절대로 실행하지 않을 Cron 식 (0) | 2018.12.19 |
[SPRING] 매개 변수 인코딩 가져 오기 (0) | 2018.12.19 |
[SPRING] Postman rest client에서 spring csrf 토큰을 보내려면 어떻게해야합니까? (0) | 2018.12.19 |