0

我们正在做一个涉及多个数据源的相当复杂的项目。目前,我们有多达 64 个 Web 服务事务,并且预计会增加更多。我们定义了一个服务层和一个 DAO。服务层类通常具有一个或多个 DAO 类来完成查找数据的工作。使用 spring xml 连接将 DAO 类连接到服务层类。

DAO 类都有一个 Interface 和一个 Impl。这里的关键是只有一个 Impl。虽然 impl 可能会改变,但即使这样也不太可能,因为 DAO 层来自稳定的遗留系统。

那么,如果只有一个 impl,那么使用弹簧接线有什么好处呢?为什么不在服务层类中实例化该类?

4

3 回答 3

5

一个原因是单元测试,如果类自己实例化它们,您将无法使用模拟将类与其依赖项隔离开来。

使用接口的一个好处是 Spring 可以使用 JDK 动态代理创建 AOP 代理(例如,用于声明性事务管理),否则它将需要 CGLIB。从 Spring docs - JDK 动态代理是首选,只要您有选择http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/aop.html#aop-proxying -

于 2013-08-30T12:58:21.483 回答
1

使用它有很多充分的理由,即使您认为不需要它。我认为这篇文章对它们进行了很好的总结。

http://tutorials.jenkov.com/dependency-injection/dependency-injection-benefits.html

于 2013-08-30T13:29:53.340 回答
0

您的 DAO 可能需要其他配置,而不仅仅是实现类(数据源 URL、连接池参数等)。在依赖注入的哲学中,这些细节应该被排除在代码之外,因为它们构成了配置。服务类应该包含严格的业务逻辑。

话虽如此,对于基于 XML 的配置描述符的强烈反对,以支持代码内元数据,如下所示:

@Inject
private CustomerDAO customerDAO;

这将导致 Spring 自动注入 CustomerDAOImpl,只要它是它找到的唯一 CustomerDAO 实现。CustomerDAOImpl 类可能有其他注释来指定所有必要的配置细节。

于 2013-08-30T13:02:03.743 回答