봄은 추상적인 수업 안에서 자동 학습할 수 있나요?
봄은 내 물건의 자동 전원에 실패한다?추상 클래스 내에서 객체를 자동 연결할 수 있습니까?모든 스키마가 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" />
해결책을 찾기 위해 다음과 같은 참고 자료도 시도했습니다.
- http://www.captaindebug.com/2011/06/implementing-springs-factorybean.html #.WqF5pJPWAAN
- http://forum.spring.io/forum/spring-projects/container/46815-problem-with-autowired-in-abstract-class
- https://github.com/cavallefano/Abstract-Factory-Pattern-Spring-Annotation
- http://www.jcombat.com/spring/factory-implementation-using-servicelocatorfactorybean-in-spring
- https://www.madbit.org/blog/programming/1074/1074/ #sthash.XEJXdIR5.dpbs
- 스프링 프레임워크에 추상 팩토리 사용
- 스프링 자동 배선이 Abstract 클래스에 대해 작동하지 않습니다.
- 추상 슈퍼클래스에 스프링 의존성
- 스프링 및 추상 클래스 - 추상 클래스에 속성 주입
사용해보시기 바랍니다.**@Configurable(dependencyCheck = true)**이 게시물을 업데이트하면 문제가 생기면 제가 도와드리겠습니다.
언급URL : https://stackoverflow.com/questions/19965829/spring-can-you-autowire-inside-an-abstract-class
'programing' 카테고리의 다른 글
| Bash에서 파일 이름 및 확장자 추출 (0) | 2023.04.09 |
|---|---|
| TypeScript에서 날짜 유형을 어떻게 표현합니까? (0) | 2023.04.04 |
| AJAX 요청을 정기적으로 실행하는 방법 (0) | 2023.04.04 |
| 모든 범주 나열(손자만 고정됨)(Wordpress) (0) | 2023.04.04 |
| Wordpress 사용자 메타 데이터베이스에 PHP 배열 저장 (0) | 2023.04.04 |