2개의 빈을 자동 배선하여 동일한 인터페이스를 구현합니다.기본 빈을 autowire로 설정하려면 어떻게 해야 합니다.
배경:
Spring 2.5/Java/Tomcat 어플리케이션이 있습니다.여러 곳에서 응용 프로그램을 통해 사용되는 다음과 같은 콩이 있습니다.
public class HibernateDeviceDao implements DeviceDao
그리고 다음 새로운 콩:
public class JdbcDeviceDao implements DeviceDao
첫 번째 빈은 다음과 같이 설정됩니다(패키지 내의 모든 빈이 포함됩니다).
<context:component-scan base-package="com.initech.service.dao.hibernate" />
두 번째(새) 빈은 별도로 구성됩니다.
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
<property name="dataSource" ref="jdbcDataSource">
</bean>
이 결과(물론 서버 시작 시 예외)가 발생합니다.
중첩된 예외는 org.springframework입니다.콩류.Such Bean Definition 없음예외:[com] 유형의 고유한 빈이 없습니다.7p.mobile.samplemgmt.service.dao 입니다.DeviceDao]가 정의되어 있습니다.단일 일치 빈이 필요하지만 2: [deviceDao, jdbcDeviceDao]를 찾았습니다.
이렇게 콩을 자동배선하려고 하는 학급에서
@Autowired
private DeviceDao hibernateDevicDao;
같은 인터페이스를 실장하고 있는2개의 콩이 있기 때문입니다.
질문:
콩을 구성해서
1. 기존 클래스는 변경할 필요가 없습니다.기존 클래스는 이미 다음과 같이 되어 있습니다.HibernateDeviceDao
배선
2. 두 번째 (새) 콩을 이렇게 사용할 수 있습니다.
@Autowired
@Qualifier("jdbcDeviceDao")
를 들어,는 를어,, 템 the the the the the the the the 를 설정하는 방법이 합니다.HibernateDeviceDao
공급되는 할 수 .JdbcDeviceDao
하여 명시적으로 @Qualifier
석입니니다다
내가 이미 시도한 것:
속성을 설정해 보았습니다.
autowire-candidate="false"
Jdbc Device Dao의 bean Configuration에서 다음을 수행합니다.
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
<property name="dataSource" ref="jdbcDataSource"/>
</bean>
왜냐하면 스프링 문서에는 다음과 같습니다.
다른 빈의 자동 배선 요구 사항을 충족하기 위해 일치하는 후보를 찾을 때 이 빈을 고려해야 하는지 여부를 나타냅니다.이는 이름에 의한 명시적 참조에는 영향을 주지 않으므로 지정된 bean이 자동 배선 후보로 마크되어 있지 않아도 해결됩니다.*
자동 했습니다.JdbcDeviceDao
@Qualifier
을 달아야 합니다.HibernateDeviceDao
디폴트 빈으로 합니다.하면, 과 같은 제 것 .
타입 [class com]의 의존성이 불충분합니다.7p.mobile.samplemgmt.service.dao.jdbc 를 지정합니다.Jdbc Device Dao]: 일치하는 콩이 하나 이상 필요합니다.
수식자와 함께 콩에 자동 배선을 시도했던 수업에서 나온 것입니다.
@Autowired
@Qualifier("jdbcDeviceDao")
솔루션:
skaffman의 제안으로 @Resource 주석을 시험해 보았습니다.따라서 설정에서는 jdbc Device Dao에 대해 autowire-candidate가 false로 설정되어 있습니다.jdbc Device Dao를 사용할 때는 @Qualifier가 아닌 @Resource 주석을 사용하여 참조합니다.
@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;
를 사용하여 휴지 상태 DAO 클래스를 표시할 것을 권장합니다(사용한 경우).@Repository
에HibernateDeviceDao
):
@Primary
@Repository
public class HibernateDeviceDao implements DeviceDao
이렇게 하면 기본 자동 배선 후보로 선택되기 때문에 다음 작업을 수행할 필요가 없습니다.autowire-candidate
다른 쪽 콩에.
또, 사용하는 것보다@Autowired @Qualifier
, 사용하는 것이 더 우아하다고 생각합니다.@Resource
특정 콩을 따기 위해서요
@Resource(name="jdbcDeviceDao")
DeviceDao deviceDao;
뭐에 대해서?
여러 후보가 단일 값 종속성을 자동 연결할 수 있는 경우 빈을 우선해야 함을 나타냅니다.후보 중 '프라이머리' 빈이 1개만 있는 경우, 이 빈은 자동 배선된 값이 됩니다.이 주석은 의미론적으로 다음과 같습니다.
<bean>
요소primary
spring XML의 Atribute.
@Primary
public class HibernateDeviceDao implements DeviceDao
또는 Jdbc 버전을 기본적으로 사용하는 경우:
<bean id="jdbcDeviceDao" primary="true" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
@Primary
는 실제 가동 중인 콩에 주석을 달아 쉽게 교체할 수 있는 통합 테스트에도 적합합니다.
Spring 2.5에서는@Primary
. 유일한 방법은 사용방법입니다.@Qualifier
.
The use of @Qualifier will solve the issue.
Explained as below example :
public interface PersonType {} // MasterInterface
@Component(value="1.2")
public class Person implements PersonType { //Bean implementing the interface
@Qualifier("1.2")
public void setPerson(PersonType person) {
this.person = person;
}
}
@Component(value="1.5")
public class NewPerson implements PersonType {
@Qualifier("1.5")
public void setNewPerson(PersonType newPerson) {
this.newPerson = newPerson;
}
}
Now get the application context object in any component class :
Object obj= BeanFactoryAnnotationUtils.qualifiedBeanOfType((ctx).getAutowireCapableBeanFactory(), PersonType.class, type);//type is the qualifier id
you can the object of class of which qualifier id is passed.
@Resource(이름 = "{ your child class name}")는 작동하지만 @Autowired가 작동하지 않는 이유는 일치 시퀀스가 다르기 때문입니다.
@Autowire의 일치 시퀀스
유형, 한정자, 이름
@Resource의 일치 시퀀스
이름, 유형, 한정자
상세한 것에 대하여는, 다음의 URL 를 참조해 주세요.
주입 및 리소스 및 자동 배선 주석
이 경우 부모 클래스 또는 인터페이스에서 상속된 다른 자녀 클래스는 같은 유형이기 때문에 @Autowire를 혼동합니다.@Resource use Name as first matching priority는 동작합니다.
언급URL : https://stackoverflow.com/questions/10534053/autowiring-two-beans-implementing-same-interface-how-to-set-default-bean-to-au
'source' 카테고리의 다른 글
VS Code가 긴 HTML 행을 여러 줄로 분할하지 않도록 하려면 어떻게 해야 합니까? (0) | 2022.09.04 |
---|---|
파일을 한 줄 한 줄 목록으로 읽는 방법 (0) | 2022.09.04 |
서버 오류(BadRequest): 포드의 "mariadb" 컨테이너가 시작 대기 중입니다. CreateContainerConfigError (0) | 2022.09.04 |
주문 보존 세트로 수집하는 Collector가 있습니까? (0) | 2022.09.04 |
각 루프의 반복이 시작되기 전에 늘체크를 회피하는 방법이 있나요? (0) | 2022.09.04 |