答案 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,服务就不能存在。在我看来,构造函数参数更好地传达了这个契约。此外,它可能使该类更易于测试和维护。