尝试管理共享公共基类的多个类时出现Spring错误?

时间:2011-03-27 05:29:09

标签: spring

1 个答案:

答案 0 :(得分:3)

只有在Spring Context中只存在一个特定类型的实现bean时,自动装配才有效。我假设使用泛型D扩展BaseDao导致Spring试图自动装配BaseDao实例而不是UserDao和ApprovalDao的情况。因为UserDao和ApprovalDao都实现了BaseDao,所以Spring上下文包含BaseDao的多个实现,无法决定应该使用哪个。

Spring试图在堆栈跟踪中告诉你

org.springframework.beans.factory.NoSuchBeanDefinitionException: 
__No unique bean of type__ [com.primetech.core.parent.BaseDAO] is defined:
expected single matching bean but found 2: [userDAO, approvalDAO]

您可以尝试使用实际dao类型在具体服务中定义dao来测试这一点,例如。

public abstract class BaseService<K, E extends BaseEntity, D extends BaseDAO<K, E>> {
   private final D dao;
   protected BaseService(D dao) {
      this.dao = dao;
   } 
}

public class UserService extends BaseService<K, User, UserDao<K, User>> {
   @Autowired
   public UserService(UserDao dao) {
     super(dao);
   }
}

我将继续为UserDao和ApprovalDao定义接口,以便依赖关系在接口而不是实现上。 daos可能仍然有一个共同的超级接口,它们的实现可能基于BaseDao,以避免不必要的重复。

在示例中,我在构造函数中定义了注入的Dao,因为我假设在整个服务生命周期中应该使用相同的dao实例,并且如果没有dao set,服务就不能存在。在我看来,构造函数参数更好地传达了这个契约。此外,它可能使该类更易于测试和维护。