为什么我们在spring MVC模式中使用接口?

时间:2014-12-15 18:45:44

标签: java spring-mvc

我是Spring MVC的新手,我已经下载了一个小型的MVC项目。项目执行正常,但正在使用此项目接口和类。 像


public interface EmployeeService {

    public void addEmployee(Employee employee);

    public List listEmployeess();

    public Employee getEmployee(int empid);

    public void deleteEmployee(Employee employee);
}


public class EmployeeServiceImpl implements EmployeeService {

    @Autowired
    private EmployeeDao employeeDao;

    @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
    public void addEmployee(Employee employee) {
        employeeDao.addEmployee(employee);
    }

    public List listEmployeess() {
        return employeeDao.listEmployeess();
    }

    public Employee getEmployee(int empid) {
        return employeeDao.getEmployee(empid);
    }

    public void deleteEmployee(Employee employee) {
        employeeDao.deleteEmployee(employee);
    }

}

我怀疑的是,如果我们使用EmployeeServiceImpl实施EmployeeService的需要是什么?同样的事情在EmployeeDaoEmployeeDaoImpl

5 个答案:

答案 0 :(得分:3)

接口总是解耦的好方法,但是,在谈到Spring时,有几个功能可以使用接口而不是具体类。

代理的一大优势 - Spring AOP。

您可以在此处找到更多信息:http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/aop.html

还有其他优点,比如后期处理等等,但我想你会对Spring AOP有一个有趣的阅读。

答案 1 :(得分:3)

天气春天mvc与否,应始终编码接口。界面给我提供了更好的可读性,当我只是想看看这个类的功能而不是担心它是如何做的时候,那种暴露给外部世界的API。

另一个好处是可能有多个“如何做”的实现,而spring有助于在多个实现之间轻松切换。对于例如您可以再使用一个EmployeeService实现,如FullTimeEmployeeServiceImpl,RemoteEmployeeServiceImpl。

现在,如果您有使用EmployeeService的客户端类:

class EmployeeManager{
    private EmployeeService service;
}

你可以在这里注入任何bean

<bean id="employeeManager" class="com.abc.EmployeeManager">
  <property name="service" ref="fullTimeEmployee | remoteEmployee" >
</bean>

<bean id="fullTimeEmployee" class="com.abc.FullTimeEmployeeServiceImpl" />
<bean id="remoteEmployee" class="com.abc.RemoteEmployeeServiceImpl" />

答案 2 :(得分:2)

OO设计的SOLID首字母缩写的一些原则适用于此:

  1. Liskov substitution principle - 您应该能够替换T的任何子类型,而不会影响问题的结果。例如,如果您调用返回List<>的方法,并且底层实现从返回ArrayList<>切换到LinkedList<>,则您的程序仍应以相同的方式执行。基本上,您应该设计类,以便客户端依赖项可以替换为子类,而客户端不知道更改。以下是维基页面的简短片段:
  2.   

    可替代性是面向对象编程的一个原则。它   声明,在计算机程序中,如果S是T的子类型,那么   类型T的对象可以用类型S的对象替换(即,   类型S的对象可以替换类型为T)的对象而不改变   该程序的任何理想属性(正确性,任务   表演等。)

    1. Dependency inversion principle - 主要思想是根据它所依赖的抽象将边界后面的类隔离开来。这样,如果这些抽象背后的任何细节发生变化,那么该课程将不受影响。
    2.   

      在面向对象编程中,依赖性反转原理   指特定形式的解耦软件模块。什么时候   遵循这一原则,传统的依赖关系   从高级别的政策制定模块建立到低级别,   依赖模块被反转(即反转),从而呈现   高级模块独立于低级模块实现   细节。原则陈述

          A. High-level modules should not depend on low-level modules. 
             Both should depend on abstractions.
          B. Abstractions should not depend on details. 
             Details should depend on abstractions.
      

答案 3 :(得分:0)

与Spring或MVC没什么关系。使用接口进行设计是一种很好的做法,因此实现可以很容易地改变。它提供松耦合,如果你使用弹簧,你可以简单地改变实现。什么时候需要。

此外,它在使用Junit进行测试时也很有帮助。你可以轻松地模拟你的dao。

答案 4 :(得分:-1)

建议针对接口编写代码,而不是特定的实现。

这样,客户端代码不知道具体的实现,只知道合同。

关于Spring,你通常必须使用接口,因为Spring经常需要创建Java代理,这只能用于实现接口的类。