我有两个类CustomerDAOImpl和UserDAOImpl,都使用@Repository注释进行注释。我在每个类中定义了@Bean并自动装配。
@Repository
public class CustomerDAOImpl implements CustomerDAO {
private static final String CUSTOMER_LOCK_INSERT = "INSERT INTO CUSTOMER_LOCKS (customerid, userid, session) VALUES (?, ?, ?)";
@Bean
@Lazy(true)
public PreparedStatement customerLockAddStmt () {
return cassandraTemplate.getSession().prepare(CUSTOMER_LOCK_INSERT);
}
@Autowired
@Lazy
PreparedStatement customerLockAddStmt;
@Autowired
CassandraOperations cassandraTemplate;
public void create(CustomerLock lock) {
...
Statement statement = customerLockAddStmt.bind(lock.customerId,lock.userId, lock.sessionId);
cassandraTemplate.execute(statement);
}
}
完全相同的方式,我已在UserDAOImpl类方法中定义,自动装配并使用了以下bean(只显示bean定义和自动装配代码以保持其清洁和简短):
@Bean
@Lazy(true)
public PreparedStatement userAddStmt () {
return cassandraTemplate.getSession().prepare(USER_INSERT);
}
@Bean
@Lazy(true)
public PreparedStatement userUpdateStmt () {
return cassandraTemplate.getSession().prepare(USER_UPDATE);
}
@Autowired
@Lazy
PreparedStatement userAddStmt;
@Autowired
@Lazy
PreparedStatement userUpdateStmt;
@Autowired
CassandraOperations cassandraTemplate;
public void update(User user){
//Beans userAddStmt and userUpdateStmt defined and autowired in this class are being used here
....
}
现在这两个DAO Beans都在我的服务类OrderServiceImpl中自动装配(用@Service注释);这是片段:
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
UserDAO userDAO;
@Autowired
CustomerDAO customerDAO;
public void createOrder(Order order) {
....
customerDAO.create(CustomerLock); // Getting the exception on this line
....
userDAO.update(user);
....
}
}
当OrderService代码执行" customerDAO.create(CustomerLock);" ,我得到了这个例外。
没有定义[com.datastax.driver.core.PreparedStatement]类型的限定bean:期望的单个匹配bean但找到2:userAddStmt,userUpdateStmt"。
收到此错误后,我添加了属性名称=" customerLockAddStmt" in" customerLockAddStmt" bean定义并使用@Qualifier(" customerLockAddStmt")在自动装配这个bean的时候,它工作但是现在它在跟随行上失败了,因为在userDAOImpl中连接的bean有相同的错误:
userDAO.update(user);
没有定义[com.datastax.driver.core.PreparedStatement]类型的限定bean:期望的单个匹配bean但找到1:customerLockAddStmt"。
有人可以帮忙吗?
答案 0 :(得分:1)
Spring IoC容器将使用配置管理对象之间的依赖关系;它连接相关对象,根据您的配置实例化并提供它们。如果你有多个相同类型的bean并不重要,容器会处理它直到你需要它 - 这是你的情况。
你有多个相同类型的bean,它们确实可以注入,但是容器无法弄明白你当时要求的那个< / em>,所以基本上你需要更多地控制选择过程,因此,可以使用Spring的@Qualifier
注释。
另一方面,如果按名称进行多次注释驱动注入,请不要主要使用@Autowired
;相反,使用语义定义的@Resource
通过其唯一名称标识特定目标组件,声明的类型与匹配过程无关。
更新:您可以参考this帖子以及Spring Framework Reference Documentation (Dependency Injection and Inversion of Control)。