我们正在做一个相当复杂的项目,它可以访问多个数据源。目前,我们最多可以进行64次Web服务交易,并期望增加更多。我们定义了一个服务层和一个DAO。服务层类通常具有一个或多个DAO类,用于查找数据。使用spring xml连接将DAO类连接到服务层类中。
DAO类都有一个接口和一个Impl。这里的关键是只有一个Impl。虽然impl可能会发生变化,但即使这样也不太可能,因为DAO层来自一个稳定的遗留系统。
如果只有一个impl,那么弹簧接线有什么好处?为什么不在服务层类中实例化类?
答案 0 :(得分:5)
一个原因是单元测试,如果类本身实例化它们,你将无法通过模拟将类与其依赖项隔离开来。
使用接口的好处是Spring可以使用JDK动态代理创建AOP代理(例如,用于声明式事务管理),否则它将需要CGLIB。从Spring docs - 只要您选择http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/aop.html#aop-proxying -
,首选JDK动态代理答案 1 :(得分:1)
使用它有很多充分的理由,即使您认为不需要它也是如此。 我认为这篇文章总结得相当不错。
http://tutorials.jenkov.com/dependency-injection/dependency-injection-benefits.html
答案 2 :(得分:0)
您的DAO可能需要其他配置,而不仅仅是实现类(数据源URL,连接池参数等)。在依赖注入的哲学中,这些细节应该保留在代码之外,因为它们构成了配置。服务类应严格包含业务逻辑。
话虽如此,对基于XML的配置描述符的反对有利于代码内元数据,如下所示:
@Inject
private CustomerDAO customerDAO;
这将导致Spring自动注入CustomerDAOImpl,只要它是它找到的唯一CustomerDAO实现。 CustomerDAOImpl类可以依次具有指定所有必要配置细节的其他注释。