Lý lịch:
Tôi có một ứng dụng Spring 2.5 / Java / Tomcat. Có loại đậu sau, được sử dụng trong suốt ứng dụng ở nhiều nơi
public class HibernateDeviceDao implements DeviceDao
và đậu sau đây là mới:
public class JdbcDeviceDao implements DeviceDao
Bean đầu tiên được cấu hình như vậy (bao gồm tất cả các bean trong gói)
<context:component-scan base-package="com.initech.service.dao.hibernate" />
Bean thứ hai (mới) được cấu hình riêng
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
<property name="dataSource" ref="jdbcDataSource">
</bean>
Kết quả này (tất nhiên) trong một ngoại lệ khi khởi động máy chủ:
ngoại lệ lồng nhau là org.springframework.beans.factory.NoSuchBeanDefTHERException: Không có bean duy nhất nào thuộc loại [com.sevenp.mobile.samplemgmt.service.dao.DeviceDao] được định nghĩa: bean phù hợp dự kiến nhưng được tìm thấy 2: [deviceDao, jdbc
từ một lớp học cố gắng tự động đậu như thế này
@Autowired
private DeviceDao hibernateDevicDao;
bởi vì có hai hạt thực hiện cùng một giao diện.
Câu hỏi:
Có thể cấu hình đậu sao cho
1. Tôi không cần phải thực hiện thay đổi đến các lớp học hiện có, mà đã có HibernateDeviceDao
autowired
2. vẫn có thể sử dụng bean thứ hai (mới) như thế này:
@Autowired
@Qualifier("jdbcDeviceDao")
Tức là tôi sẽ cần một cách để cấu hình HibernateDeviceDao
bean làm bean mặc định được tự động, đồng thời cho phép sử dụng một JdbcDeviceDao
khi rõ ràng chỉ định như vậy với @Qualifier
chú thích.
Những gì tôi đã thử:
Tôi đã thử thiết lập tài sản
autowire-candidate="false"
trong cấu hình bean cho JdbcDeviceDao:
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
<property name="dataSource" ref="jdbcDataSource"/>
</bean>
bởi vì tài liệu về mùa xuân nói rằng
Cho biết liệu có nên xem xét loại đậu này hay không khi tìm kiếm các ứng cử viên phù hợp để đáp ứng các yêu cầu tự động của một loại đậu khác. Lưu ý rằng điều này không ảnh hưởng đến các tham chiếu rõ ràng theo tên, điều này sẽ được giải quyết ngay cả khi bean được chỉ định không được đánh dấu là một ứng cử viên tự động. *
mà tôi đã giải thích có nghĩa là tôi vẫn có thể tự động JdbcDeviceDao
sử dụng @Qualifier
chú thích và có HibernateDeviceDao
bean mặc định. Tuy nhiên, rõ ràng cách giải thích của tôi không đúng, vì điều này dẫn đến thông báo lỗi sau khi khởi động máy chủ:
Sự phụ thuộc không thỏa mãn của loại [class com.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDeviceDao]: dự kiến ít nhất 1 bean phù hợp
đến từ lớp học mà tôi đã thử tự động đậu với vòng loại:
@Autowired
@Qualifier("jdbcDeviceDao")
Giải pháp:
đề nghị của skaffman để thử chú thích @Resource hoạt động. Vì vậy, cấu hình có ứng cử viên tự động được đặt thành false cho jdbcDeviceDao và khi sử dụng jdbcDeviceDao, tôi đề cập đến nó bằng cách sử dụng chú thích @Resource (thay vì @Qualifier):
@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;