gpt4 book ai didi

java - 无法 Autowiring 使用来自两个不同类的 @Bean 定义的 bean

转载 作者:行者123 更新时间:2023-12-01 09:08:05 25 4
gpt4 key购买 nike

我有两个类 CustomerDAOImpl 和 UserDAOImpl,都用 @Repository 注释进行注释。我在每个类中定义并 Autowiring 了 @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 类方法中定义、 Autowiring 并使用了以下 bean(仅显示 bean 定义和 Autowiring 代码,以保持此处的简洁和简短):

    @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 Bean 都在我的服务类 OrderServiceImpl 中 Autowiring (用 @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”bean 定义中添加了属性 name="customerLockAddStmt"并在 Autowiring 此 bean 时使用了 @Qualifier("customerLockAddStmt"),它有效,但现在由于相同的原因在下一行失败userDAOImpl 中连接的 beans 错误:

userDAO.update(user); 

未定义 [com.datastax.driver.core.PreparedStatement] 类型的合格 bean:预期有单个匹配 bean,但发现 1:customerLockAddStmt”。

有人可以帮忙吗?

最佳答案

Spring IoC容器将使用配置来管理对象之间的依赖关系;它连接相关对象,实例化并根据您的配置提供它们。如果您有多个相同类型的 bean 也没关系,容器会处理它,直到您需要它们为止 - 这就是您的情况。

你有多个相同类型的bean,它们确实可以被注入(inject),但容器无法弄清楚你当时要求的是什么,所以基本上您需要对选择过程进行更多控制,因此可以使用 Spring 的 @Qualifier 注解。

另一方面,如果您有许多按名称注释驱动的注入(inject),则不要主要使用@Autowired;相反,使用在语义上定义的@Resource,通过其唯一名称来标识特定的目标组件,声明的类型与匹配过程无关。

更新:您可以引用this帖子以及Spring Framework Reference Documentation (Dependency Injection and Inversion of Control) .

关于java - 无法 Autowiring 使用来自两个不同类的 @Bean 定义的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41093322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com