无法使用@Bean从两个不同的类自动装配bean

时间:2016-12-12 02:15:06

标签: java spring autowired

我有两个类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"。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

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

你有多个相同类型的bean,它们确实可以注入,但是容器无法弄明白你当时要求的那个< / em>,所以基本上你需要更多地控制选择过程,因此,可以使用Spring的@Qualifier注释。

另一方面,如果按名称进行多次注释驱动注入,请不要主要使用@Autowired;相反,使用语义定义的@Resource通过其唯一名称标识特定目标组件,声明的类型与匹配过程无关。

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