建议在Java想上的复杂结构(DAO和服务层连接/耦合)(Advice wanted on a co

2019-08-02 07:52发布

介绍

我试图在Java中的相当复杂的结构,接口,抽象类和泛型。 经与仿制药的使用和创建良好的面向对象设计,只有平均经验没经验,这是开始证明相当大的挑战。

我有一些感觉,我想要做的实际上不能做,但我能足够靠近它。 我会努力,我可以解释它简短。 我只是要告诉直线距离,这种结构将代表我的DAO和服务层来访问数据库。 使这一问题更加抽象只会变得更加困难。

我DAO层是完全没问题,因为它是。 有一个通用的DAO接口,并为每个实体,也就是扩展了通用的一个,并在泛型类型填补了DAO接口。 此外,还有由每个DAO实现,进而实现相应的接口扩展的抽象类。 对于最有可能混淆读,所以这里显示了DAO的产品为例图:

现在的服务类,我心中有一个类似的结构。 大多数在服务类映射到DAO方法的方法呢。 如果你有以上的“服务”图中的每一个替换“道”,你对我的服务层的基础。 但有一两件事,我想做的事情,基于下面的想法,我有:

每个服务类的实体将至少获得一个DAO对象,它是专为实体即DAO。

这是...

问题/问题

如果我可以做一个适当的面向对象的设计, 使每个服务类有各自的实体的DAO对象我的服务层将是完美的一个实例变量 ,在我看来。 此建议是值得欢迎的,万一我的设计也不是那么好,因为它看起来。

我已经实现了它这样的:

类AbstractService

public abstract class AbstractService<EntityDAO> {

    EntityDAO entityDAO;

    public AbstractService() {
        entityDAO = makeEntityDAO(); //compiler/IDE warning: overridable method call in constructor
    }

    abstract EntityDAO makeEntityDAO();
}

类ProductServiceImpl

public class ProductServiceImpl extends AbstractService<ProductDAOImpl> {

    public ProductServiceImpl() {
        super();
    }

    @Override
    ProductDAOImpl makeEntityDAO() {
        return new ProductDAOImpl();
    }
}

这种设计的问题是一个编译器警告我不喜欢:它在构造函数中重写方法调用 (见注释)。 现在,它的设计是重写的,其实我强制执行,以确保每个服务类有相应的DAO的引用。 这是我能做到的最好的事情?

我已经做了我的绝对最好的,包括所有你可能需要的,只有你需要什么这个问题。 所有我现在要说的是,意见,欢迎和广泛的答案,甚至更多, 感谢你的时间阅读。

在计算器上其他资源

了解服务和DAO层

DAO和服务层(JPA /休眠+春季)

Answer 1:

只要稍加注意第一:通常像演示/服务/ DAO例如层组织的应用程序,您有以下规则:

  • 每一层都知道正下方仅层。
  • 它只能通过它的接口知道它,而不是它的实现类。

这将提供更容易的测试,一个更好的代码封装,不同层的(通过接口被容易地识别为公共API)更清晰的定义

这就是说,有是处理这类情况的方式,允许最大的灵活性非常常见的方式: 依赖注入 。 而春天是行业标准的实施依赖注入(和很多其他的东西)

这个想法(简称)是您的服务将知道它需要一个IEntityDAO,并有人将它和接口的实现实际上是在使用服务前注入。 有人被称为IOC容器( 控制反转容器)。 它可以是春天 ,和它做什么,通常是由应用程序配置文件中描述的,将在应用程序启动完成。

重要提示:这个概念是辉煌的,强大的,但死的简单愚蠢。 您也可以使用控制架构模式的反转没有一个框架,由一个大的静态方法非常简单的实现“组装”应用程序的部分。 但是,在工业方面,最好有一个框架,这将使注入其他的东西,如数据库连接,Web服务桩模块的客户,JMS队列,等...

优点:

  • 你拥有了一个简单的时间嘲讽和测试,作为唯一一类依赖于在接口
  • 你有一小部分的描述您的应用程序,这是当你的应用程序的增长非常方便的整体结构的XML文件的单个文件。
  • 这是一个非常广泛采用的标准和公 - 许多Java开发人员知道。

Java代码示例:

public abstract class AbstractService<IEntityDAO> {

    private IEntityDAO entityDAO; // you don't know the concrete implementation, maybe it's a mock for testing purpose

    public AbstractService() {
    }

    protected EntityDAO getEntityDAO() { // only subclasses need this method
    }

    public void setEntityDAO(IEntityDAO dao) { // IOC container will call this method
        this.entityDAO = dao;
    }
}

而在Spring配置文件中,你将有类似的东西:

<bean id="ProductDAO" class="com.company.dao.ProductDAO" />

[...]

<bean id="ProductService" class="com.company.service.ProductService">
    <property name="entityDAO" ref="ProductDAO"/>
</bean>


文章来源: Advice wanted on a complex structure in java (DAO and Service Layer linking/coupling)