[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.나는 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.@Primary는 어떻습니까?
@Primary는 어떻습니까?
@Primary public class HibernateDeviceDao implements DeviceDao
또는 Jdbc 버전을 기본적으로 사용하려면 다음을 수행하십시오.
<bean id="jdbcDeviceDao" primary="true" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
@Primary는 생산 빈을 스텁 버전으로 쉽게 대체 할 수있을 때 통합 테스팅에도 유용합니다.
-
==============================
3.Spring 2.5에는 @Primary가 없다. 유일한 방법은 @Qualifier를 사용하는 것입니다.
Spring 2.5에는 @Primary가 없다. 유일한 방법은 @Qualifier를 사용하는 것입니다.
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
'SPRING' 카테고리의 다른 글
[SPRING] Jackson과 함께 열거 형 직렬화 (0) | 2018.12.13 |
---|---|
[SPRING] 저장 프로 시저를 호출하기위한 Spring JDBC 템플릿 (0) | 2018.12.13 |
[SPRING] Spring + Web MVC : dispatcher-servlet.xml과 applicationContext.xml (공유 보안 포함) (0) | 2018.12.13 |
[SPRING] Spring 3.0에 포함시킬 maven 종속성은 무엇입니까? (0) | 2018.12.13 |
[SPRING] Spring Data JPA의 CrudRepository와 JpaRepository 인터페이스의 차이점은 무엇입니까? (0) | 2018.12.13 |