복붙노트

[SPRING] 스프링 자동 와이어 링은 인터페이스에서만 작동합니다.

SPRING

스프링 자동 와이어 링은 인터페이스에서만 작동합니다.

나는 스프링 프레임 워크에 익숙하지 않으며 다음과 같은 문제에 직면했다.

ClassA1 및 ClassA2 클래스로 구현되는 인터페이스 ClassA가 있습니다.

applicationContext.xml에 다음 bean 정의가 추가되었습니다.

<bean id="class1" class="com.abc.ClassA1" />
<bean id="class2" class="com.abc.ClassA2" />

아래 두 구현 클래스를 Autowire하고 싶습니다.

@Autowired
private ClassA1 classA1;

@Autowired
private ClassA2 classA2;

위의 코드는 다음과 같이 오류를 던지고 있습니다.

하지만, autowiring을 아래와 같이 변경하면 :

@Autowired
ClassA classA1;

그런 다음 ClassA1은 변수에 자동으로 연결됩니다. 나는 ClassA2에 변수를 어떻게 집어 넣을 수 있는지에 관해선 알지 못한다.

해결법

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

    1.어떤 이유로 든 수업은 Spring에 의해 프록시 처리됩니다. 이것이 일어날 수있는 많은 이유가 있습니다. 예를 들어, JPA 또는 AOP를 사용하면 원래 클래스가 프록시됩니다.

    어떤 이유로 든 수업은 Spring에 의해 프록시 처리됩니다. 이것이 일어날 수있는 많은 이유가 있습니다. 예를 들어, JPA 또는 AOP를 사용하면 원래 클래스가 프록시됩니다.

    클래스가 인터페이스를 구현하는 경우 프록시는 동적 프록시를 의미합니다. 그래서 기본적으로 인터페이스를 구현하지만 원래 클래스를 상속하지 않는 런타임에 새로운 클래스가 생성됩니다. 따라서 원래 클래스에 대한 자동 와이어 링이 작동하지 않습니다.

  2. ==============================

    2.오브젝트가 JDK 프록시에 의해 프록시되는 경우 인터페이스에 의해 참조되어야합니다. aop 구성 (applicationContext.xml)에서 CGLIB (클래스 경로에 있음)와 proxy-target-class = "true"를 사용하여 구체적인 클래스로 프록시를 만들 수 있습니다.

    오브젝트가 JDK 프록시에 의해 프록시되는 경우 인터페이스에 의해 참조되어야합니다. aop 구성 (applicationContext.xml)에서 CGLIB (클래스 경로에 있음)와 proxy-target-class = "true"를 사용하여 구체적인 클래스로 프록시를 만들 수 있습니다.

  3. ==============================

    3.이 문제를 해결하기 위해 여러 가지 방법을 시도했지만 다음과 같은 방법으로 작업했습니다.

    이 문제를 해결하기 위해 여러 가지 방법을 시도했지만 다음과 같은 방법으로 작업했습니다.

    @Autowired
    private ClassA classA1;
    
    @Autowired
    private ClassA classA2;
    

    응용 프로그램 컨텍스트에서 다음과 같이 bean을 정의했습니다.

    <bean id="classA1" class="com.abc.ClassA1" autowire="byName" />
    <bean id="classA2" class="com.abc.ClassA2" autowire="byName" />
    
  4. ==============================

    4.@Qualifier 주석을 사용할 수 있습니다.

    @Qualifier 주석을 사용할 수 있습니다.

    @Autowired
    @Qualifier("class1")
    ClassA classA1;
    
    @Autowired
    @Qualifier("class2")
    ClassA classA2;
    

    참조 : http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers

    또는 @Resource 주석 :

    @Resource(name="class1")
    ClassA classA1;
    
    @Resource(name="class2")
    ClassA classA2;
    

    참조 : http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-resource-annotation

  5. ==============================

    5.나는 Autowiring 추상 서비스와 비슷한 문제가있다. 다음과 같은 문제 코드없이 사용할 수 있습니다.

    나는 Autowiring 추상 서비스와 비슷한 문제가있다. 다음과 같은 문제 코드없이 사용할 수 있습니다.

    @Autowired
    @Qualifier("classA1")
    private ClassA1 classA1;
    
    @Autowired
    @Qualifier("classA2")
    private ClassA2 classA2;
    

    이것은 당신이 당신의 빈을 선언 할 때만 작동 할 것이다.

    <bean id="class1" class="com.abc.ClassA1" />
    

    또는 이와 같이

    @Component("classA1")
    public class ClassA1 {
    ...
    }
    
  6. ==============================

    6.내가 지금까지 본 적은부터, @Autowired로 표시 할 수있는 클래스 유형과 관련하여 아무런 제한이없는 것처럼 보입니다.

    내가 지금까지 본 적은부터, @Autowired로 표시 할 수있는 클래스 유형과 관련하여 아무런 제한이없는 것처럼 보입니다.

    문제와 관련이 없지만이 기사는 상황 자체를 참조합니다.

  7. from https://stackoverflow.com/questions/6511276/spring-autowiring-only-works-with-interface by cc-by-sa and MIT license