当前位置: 首页 > 知识库问答 >
问题:

无法自动连接使用@bean定义的来自两个不同类的bean

洪德寿
2023-03-14

我有两个类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 bean都在我的服务类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);”我有个例外。

userDAO.update(user); 

未定义[com.datastax.driver.core.PreparedStatement]类型的合格bean:应为单个匹配bean,但找到1:CustomerLockAddStmt“。

谁能帮帮忙吗?

共有1个答案

于嘉许
2023-03-14

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

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

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

更新:您可以参考这篇文章,也可以参考Spring Framework参考文档(依赖注入和控制反转)。

 类似资料:
  • 我不确定我的代码出了什么问题。我正在学习弹簧靴。但我无法运行应用程序,因为我得到以下错误 模型类 主类:

  • 问题内容: 我有一个包装连接池的类,该类从spring配置中获取其连接详细信息,如下所示: 此bean稍后在服务中使用,并与注释自动关联。 我的问题是,我该如何复制该bean并为其提供不同的连接详细信息,然后在服务中添加它。意思除了上面,我将有: 并在服务中: 问题答案: 您可以与结合使用,但在这种情况下,我建议使用: 甚至更简单:

  • 我创建了自己的库(com.custom.mylib),它返回一个字符串,如下所示。 我创建了一个将使用上述库的项目。我已将lib作为pom依赖项包含在内。但是当我尝试从我的应用程序调用库方法时。我得到了下面的错误。如何解决它? 请考虑在您的配置中定义一个“com.custom.mylog.MyLibrary”类型的bean。 我在application.properties文件中也有下面的内容,这

  • 问题内容: 背景: 我有一个Spring 2.5 / Java / Tomcat应用程序。下面的bean在整个应用程序中的许多地方都使用过 以下是新的bean: 第一个bean的配置如下(包含了软件包中的所有bean) 第二个(新)bean是单独配置的 启动服务器时,这(当然)会导致异常: 从试图像这样自动装配bean的类中 因为有两个bean实现相同的接口。 问题: 是否可以配置Bean,以便

  • 我有一个spring 2.5/Java/Tomcat应用程序。下面有一个bean,在整个应用程序的许多地方都使用了这个bean 和以下新bean: 第一个bean是这样配置的(包中的所有bean都包含在内) 第二个(新的)bean是单独配置的 这会导致(当然)启动服务器时出现异常: 嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitio

  • 我想使用ManagedBean类Users。java,创建两个具有不同作用域的bean实例。我尝试了两种方法: 1.为用户使用ManagedBean和SessionScope注释(这将创建一个带有会话范围的用户),并在faces-config.xml声明另一个来自用户的MenagedBean,带有请求范围。 注意:“组件”来自Spring框架,暂时可以忽略。 在faces-config.xml: