【问题标题】:java web applicaton layout, please explain some design principles/patternsjava web应用布局,请解释一些设计原则/模式
【发布时间】:2010-12-30 13:27:51
【问题描述】:

我正在查看这个使用 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

你们有没有在某处读到过这种布局?它被认为是最佳实践吗?

工厂、经理和服务之间有什么区别? (高级)

【问题讨论】:

  • 在类名中使用下划线当然被认为是不好的做法

标签: java hibernate oop spring


【解决方案1】:

对于使用 Spring 构建的应用程序的典型布局,我将查看随附的示例 Web 应用程序(即 Spring)。

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

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

我看到经理被用作我所说的服务的另一个名称。在这里我不知道他们在用它做什么。

【讨论】:

  • 如果它们被注入,那么该代码通常在哪里? DI 代码?
  • 好吧,管理器似乎只是 Doa 的包装器,服务似乎,类似于您所说的,包装多个管理器调用以形成一个事务单元。
  • >> 如果它们被注入,那么该代码通常在哪里? DI 代码? Spring 将进行注入,您将没有代码来执行此操作。除非您计算在 web.xml 中配置 spring 应用程序上下文。 (也许我不明白你的问题)
  • @nathan,我只是不知道注射是在哪里完成的。我会看看 web.xml 然后谢谢。
  • 希望我的编辑能澄清这一点,重点是 Spring 会处理 DI,因此您的代码不必这样做。
【解决方案2】:

我不喜欢在一个项目中结合你的接口和实现的想法。仅仅因为您想要使用接口并不意味着您想要使用 impl 并且它是繁琐的传递依赖项。主要原因是因为会有不止一个 impl(假设是 JPA/JDBC/Hibernate,或 Axis2/CXF 等)。接口不应绑定到实现,否则将失去意义。这也允许简单的依赖注入,因为 impl 只是驻留在类路径中,然后像 Proxy 或 Spring(例如)这样的东西可以注入实现。

很可能,您只需要一个:

Interface Project
   dao
      EntityDao    
   types
      Entity

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

【讨论】:

  • 一般来说,将 impl 和 spec 尽可能地分开是个好主意,但总是通过项目拆分来做到这一点可能是矫枉过正。每个新项目都涉及更多开销(例如构建系统、代码浏览)。您提到了传递性 dep 问题:它们无论如何都会在运行时(当所有库都加载时)通过以后的绑定来实现。我只会在 spec 和 impl 被解耦为一个概念、一个 api -> 多个供应商(例如 jpa-api -> hibernate-impl、jaxb-api -> jaxb-vendor-impl)时分离项目。
猜你喜欢
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
相关资源
最近更新 更多