source

2개의 빈을 자동 배선하여 동일한 인터페이스를 구현합니다.기본 빈을 autowire로 설정하려면 어떻게 해야 합니다.

factcode 2022. 9. 4. 14:29
반응형

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 클래스를 표시할 것을 권장합니다(사용한 경우).@RepositoryHibernateDeviceDao):

@Primary
@Repository
public class HibernateDeviceDao implements DeviceDao

이렇게 하면 기본 자동 배선 후보로 선택되기 때문에 다음 작업을 수행할 필요가 없습니다.autowire-candidate다른 쪽 콩에.

또, 사용하는 것보다@Autowired @Qualifier, 사용하는 것이 더 우아하다고 생각합니다.@Resource특정 콩을 따기 위해서요

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

뭐에 대해서?

여러 후보가 단일 값 종속성을 자동 연결할 수 있는 경우 빈을 우선해야 함을 나타냅니다.후보 중 '프라이머리' 빈이 1개만 있는 경우, 이 빈은 자동 배선된 값이 됩니다.이 주석은 의미론적으로 다음과 같습니다.<bean>요소primaryspring 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

반응형