복붙노트

[SPRING] 추상 클래스의 Spring Autowire Annotation : 고유 bean이 정의되어 있지 않다.

SPRING

추상 클래스의 Spring Autowire Annotation : 고유 bean이 정의되어 있지 않다.

나는 추상적 인 클래스를 가지고있다 :

@Component
public abstract class BaseReport {

  public void export() {
   ...
}

그리고 그것을 확장하는 클래스의 무리는 export () 메소드를 오버라이드 (override)한다.

@Component
public final class Report1 extends BaseReport

@Component
public final class Report2 extends BaseReport

대부분의 테스트는 아무런 문제없이 BaseReport를 확장하는 구체적인 클래스를 autowire합니다.

public class Report1Test extends BaseTest {

    @Autowired
    Report1 _report;

public class Report2Test extends BaseTest {

    @Autowired
    Report2 _report;

이것은 BaseReport를 확장하는 모든 클래스의 autowiring에 잘 동작합니다. 그러나 export () 메소드를 테스트하기 위해 추상 클래스 자체 (BaseReport)를 autowire해야합니다.

public class BaseReportTest extends BaseTest {

  @Autowired
  BaseReport _report;

내가 그것을 실행하려고하면 나는 악명 높은 것을 얻는다 :

BaseReport 유형의 고유 bean이 정의되지 않았습니다. 예상되는 단일 일치 bean이지만 발견 됨 2 [Report1, Report2].

@Qualifier를 사용해 보았지만 @Qualifier의 문제점은 Spring을 사용하여 Interface를 구현하거나 Abstract 클래스를 확장한다는 것을 Spring에 알리는 것입니다 (이해함에 따라). 하지만 그건 내 경우가 아니야. 나는 추상 클래스 자체를 사용하고 싶다.

나는 또한 다음과 같이 @Resource를 사용하여 시도했다.

public class BaseReportTest extends BaseTest {

  @Resource(name = "baseReport")
  BaseReport _report;

Spring은이 이름을 가진 bean이 없다고 알려줍니다. :(

어떻게해야합니까?

건배.

해결법

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

    1.추상 클래스는 인스턴스화 할 수 없으므로 구체적인 구현을 사용해야합니다. 일반 자바에서와 마찬가지로 추상 클래스를 인스턴스화하려고하면 추상 메소드를 구현할 것을 지시합니다. 그렇게하면 익명의 클래스가 생성됩니다. 이것은 추상 클래스의 instatiation이 아니라 그 추상 클래스의 새로운 서브 클래스입니다.

    추상 클래스는 인스턴스화 할 수 없으므로 구체적인 구현을 사용해야합니다. 일반 자바에서와 마찬가지로 추상 클래스를 인스턴스화하려고하면 추상 메소드를 구현할 것을 지시합니다. 그렇게하면 익명의 클래스가 생성됩니다. 이것은 추상 클래스의 instatiation이 아니라 그 추상 클래스의 새로운 서브 클래스입니다.

    Spring은 기본 클래스를 확장하는 클래스 인 Report1과 Report2를 찾고, Spring은 요구 사항에 부합하는 여러 클래스를 가지며 어떤 클래스를 선택할 지 알지 못합니다. 따라서 여러 개의 일치하는 빈이 있다는 오류가 발생합니다.

    "어댑터"가 기본적으로 기본 클래스를 확장하고 추상 메소드를 구현하지만 아무 것도 수행하지 않는 구체적인 클래스를 작성함으로써이를 수정할 수 있습니다. 그런 다음 구현을 자동화하고 테스트 할 수 있습니다. 그러나 추상 클래스는 보고서 1과 2를 테스트한다는 사실 때문에 이미 테스트를 거쳐야합니다. 기본 클래스에서 오류가 계속 발생하면 사용하지 않는 논리가 버그를 유발한다는 의미이며 어쨌든 나쁜 관행입니다. 또한 테스트 코베 지 도구를 사용하면 그런 식으로 사용되지 않는 코드를 발견 할 수 있습니다.

  2. from https://stackoverflow.com/questions/15971288/spring-autowire-annotation-on-abstract-class-no-unique-bean-is-defined by cc-by-sa and MIT license