Java Web应用程序布局,请解释一些设计原则/模式。

3

我正在查看一个使用Hibernate、JSP和Spring框架的Java Web应用程序。(据我所知!)

文件布局如下:

classes/com/example/project1

项目1内部

/dao
    _entity_Dao.java
/dao/hibernate/
    _entity_DaoHibernate.java
/factory
     DaoFactory.java
      DaoFactoryImpl.java
/managers
      _entity_Manager.java
/managers/impl
      _entity_ManagerImpl.java
/model
      _entity_.java
/service
      _xxxx_Service.java
/service/impl/
      _xxxx_ServiceImpl.java

你们有了解过这种布局吗?它被认为是最佳实践吗?

工厂、管理器和服务之间有什么区别?(高层次)


1
在编程中使用下划线作为类名被认为是不良的行为。 - Bozho
2个回答

1

对于使用Spring构建的应用程序的典型布局,我会查看随之提供的示例Web应用程序(指Spring)。

像DaoFactory这样的东西绝对不是最佳实践,应该注入Daos。通常情况下,除了一些不寻常的情况外,您不需要在Spring中使用工厂。注入是在Web应用程序启动时完成的,Spring读取配置信息并根据配置xml和/或注释构造所有对象并将它们插入(假设您的对象为单例范围,这对于无状态的事物如daos和服务很常见,作为原型范围的事物会在应用程序请求它们时创建新副本)。

在Spring应用程序中,服务类似于无状态会话Bean,它是涵盖用例的应用程序逻辑的事务层。因此,如果用户执行的操作会导致更新多个不同的表,则可以将daos注入该服务中,在该服务上有一个方法来更新daos,并配置Spring将该服务包装在使该方法具有事务性的代理中。

我曾看到manager被用作我所描述的服务的另一个名称。在这里,我不知道他们在做什么。


如果它们被注入,那么代码通常会放在哪里?依赖注入(DI)的代码中吗? - mrblah
好的,那些管理器似乎只是Doa的包装器,而服务似乎与您所说的类似,将多个管理器调用包装成一个事务单元。 - mrblah
如果它们被注入,那么代码通常会在哪里?DI 代码? Spring 将进行注入,您不需要编写代码来完成。除非您将 web.xml 中的 Spring 应用程序上下文配置计算在内。(也许我没有理解您的问题) - Nathan Hughes
@Nathan,我只是不知道注入是在哪里完成的。我会看一下web.xml,谢谢。 - mrblah
希望我的编辑能够澄清这一点,Spring负责依赖注入,因此您的代码不必担心。 - Nathan Hughes

0
我不喜欢将接口和实现组合在一个项目中的想法。仅仅因为你想使用接口并不意味着你想使用实现,而且这会带来繁琐的传递依赖。主要原因是因为可能会有多个实现(假设,例如JPA/JDBC/Hibernate或Axis2/CXF等)。接口不应该绑定到实现上,否则就失去了意义。这也可以方便地进行依赖注入,因为实现只需驻留在类路径上,然后像代理或Spring(例如)这样的东西就可以注入实现。
很可能,你所需要的只是:
Interface Project
   dao
      EntityDao    
   types
      Entity

HibernateImpl Project
   dao
      EntityHibernateDao
   src/main/resources/
      EntityMapping.cfg.xml

通常来说,尽可能地将实现和规范分开是一个好主意,但总是通过项目拆分来做可能会有些过度。每个新项目都会增加一些额外的工作量(例如构建系统、代码浏览)。你提到了传递依赖问题:它们最终会在运行时绑定(当所有库都被加载时)再次出现。我只会在规范和实现被视为概念上解耦的情况下分离项目,一个API -> 多个供应商(例如jpa-api -> hibernate-impl, jaxb-api -> jaxb-vendor-impl)。 - manuel aldana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接