[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.추상 클래스는 인스턴스화 할 수 없으므로 구체적인 구현을 사용해야합니다. 일반 자바에서와 마찬가지로 추상 클래스를 인스턴스화하려고하면 추상 메소드를 구현할 것을 지시합니다. 그렇게하면 익명의 클래스가 생성됩니다. 이것은 추상 클래스의 instatiation이 아니라 그 추상 클래스의 새로운 서브 클래스입니다.
추상 클래스는 인스턴스화 할 수 없으므로 구체적인 구현을 사용해야합니다. 일반 자바에서와 마찬가지로 추상 클래스를 인스턴스화하려고하면 추상 메소드를 구현할 것을 지시합니다. 그렇게하면 익명의 클래스가 생성됩니다. 이것은 추상 클래스의 instatiation이 아니라 그 추상 클래스의 새로운 서브 클래스입니다.
Spring은 기본 클래스를 확장하는 클래스 인 Report1과 Report2를 찾고, Spring은 요구 사항에 부합하는 여러 클래스를 가지며 어떤 클래스를 선택할 지 알지 못합니다. 따라서 여러 개의 일치하는 빈이 있다는 오류가 발생합니다.
"어댑터"가 기본적으로 기본 클래스를 확장하고 추상 메소드를 구현하지만 아무 것도 수행하지 않는 구체적인 클래스를 작성함으로써이를 수정할 수 있습니다. 그런 다음 구현을 자동화하고 테스트 할 수 있습니다. 그러나 추상 클래스는 보고서 1과 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
'SPRING' 카테고리의 다른 글
[SPRING] 봄 MVC 컨트롤러에서 컨텍스트 경로를 얻는 방법 (0) | 2019.02.14 |
---|---|
[SPRING] 어떻게 자바에서 주석 실행 순서를 보장하기 위해? (0) | 2019.02.14 |
[SPRING] 스프링 CSRF 토큰과 함께 Struts2에서 파일 업로드 (1) | 2019.02.14 |
[SPRING] 스프링 보안 - 액세스가 거부되었습니다 (사용자는 익명이 아닙니다) spring-security-core-4.0.3.RELEASE (0) | 2019.02.14 |
[SPRING] 같은 이름이지만 다른 패키지에있는 2 개의 bean; 어떻게 그들을 autowire? (0) | 2019.02.13 |