복붙노트

[SPRING] 동일한 인터페이스를 구현하는 두 개의 bean을 autowiring하는 방법 - 기본 bean을 autowire로 설정하는 방법?

SPRING

동일한 인터페이스를 구현하는 두 개의 bean을 autowiring하는 방법 - 기본 bean을 autowire로 설정하는 방법?

Spring 2.5 / Java / Tomcat 애플리케이션이있다. 여러 곳에서 응용 프로그램 전체에 걸쳐 사용되는 다음과 같은 bean이 있습니다.

public class HibernateDeviceDao implements DeviceDao

새로운 bean 인

public class JdbcDeviceDao implements DeviceDao

첫 번째 빈이 구성됩니다 (패키지의 모든 빈이 포함됨).

<context:component-scan base-package="com.initech.service.dao.hibernate" />

두 번째 (새) bean은 별도로 구성됩니다.

<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
    <property name="dataSource" ref="jdbcDataSource">
</bean>

이 결과는 서버를 시작할 때 예외적으로 발생합니다.

이 같은 bean을 autowire하려고하는 클래스로부터

@Autowired
private DeviceDao hibernateDevicDao;

동일한 인터페이스를 구현하는 두 개의 Bean이 있기 때문입니다.

콩을 구성하여

1. 이미 HibernateDeviceDao autowired가있는 기존 클래스를 변경할 필요가 없습니다.

2. 여전히 다음과 같은 두 번째 (새) bean을 사용할 수 있습니다.

@Autowired
@Qualifier("jdbcDeviceDao")

나는. 필자는 HibernateDeviceDao 빈을 autowired 될 기본 빈으로 설정하는 방법이 필요하다. @Qualifier 주석을 명시 적으로 지정할 때 JdbcDeviceDao의 사용을 동시에 허용한다.

나는 재산을 세우려고 애썼다.

autowire-candidate="false"

JdbcDeviceDao의 빈 구성에서 :

<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
    <property name="dataSource" ref="jdbcDataSource"/>
</bean>

Spring 설명서에

나는 여전히 @Qualifier 어노테이션을 사용하여 JdbcDeviceDao를 autowire 할 수 있고 HibernateDeviceDao를 기본 빈으로 가질 수 있다고 해석했다. 외관상으로는 나의 해석은 정확하지 않았다, 그러나 이것은 서버를 시작할 때 뒤에 오는 착오 알림말로 귀착된다 :

한정자를 사용하여 bean을 autowiring하려고했던 클래스에서왔다.

@Autowired
@Qualifier("jdbcDeviceDao")

@Resource 주석을 시도하는 skaffman의 제안이 효과를 발휘했습니다. 따라서 jdbcDeviceDao에 대해 autowire-candidate을 false로 설정하고 jdbcDeviceDao를 사용할 때 @Resource 주석을 사용하여 참조합니다 (@Qualifier 대신).

@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;

해결법

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

    1.나는 Hibernate DAO 클래스를 @Primary로 표시 할 것을 제안한다. (당신이 HibernateDeviceDao에서 @Repository를 사용했다고 가정한다) :

    나는 Hibernate DAO 클래스를 @Primary로 표시 할 것을 제안한다. (당신이 HibernateDeviceDao에서 @Repository를 사용했다고 가정한다) :

    @Primary
    @Repository
    public class HibernateDeviceDao implements DeviceDao
    

    이렇게하면 다른 빈에서 autowire-candidate를 사용할 필요없이 기본 autowire 후보로 선택됩니다.

    또한 @Autowired @Qualifier를 사용하는 대신 @Resource를 사용하여 특정 빈을 선택하는 것이 더 멋지다는 것을 알게되었습니다.

    @Resource(name="jdbcDeviceDao")
    DeviceDao deviceDao;
    
  2. ==============================

    2.@Primary는 어떻습니까?

    @Primary는 어떻습니까?

    @Primary
    public class HibernateDeviceDao implements DeviceDao
    

    또는 Jdbc 버전을 기본적으로 사용하려면 다음을 수행하십시오.

    <bean id="jdbcDeviceDao" primary="true" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
    

    @Primary는 생산 빈을 스텁 버전으로 쉽게 대체 할 수있을 때 통합 테스팅에도 유용합니다.

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

    3.Spring 2.5에는 @Primary가 없다. 유일한 방법은 @Qualifier를 사용하는 것입니다.

    Spring 2.5에는 @Primary가 없다. 유일한 방법은 @Qualifier를 사용하는 것입니다.

  4. from https://stackoverflow.com/questions/10534053/autowiring-two-beans-implementing-same-interface-how-to-set-default-bean-to-au by cc-by-sa and MIT license