我是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
的需要是什么?同样的事情在EmployeeDao
和EmployeeDaoImpl
。
答案 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首字母缩写的一些原则适用于此:
T
的任何子类型,而不会影响问题的结果。例如,如果您调用返回List<>
的方法,并且底层实现从返回ArrayList<>
切换到LinkedList<>
,则您的程序仍应以相同的方式执行。基本上,您应该设计类,以便客户端依赖项可以替换为子类,而客户端不知道更改。以下是维基页面的简短片段:可替代性是面向对象编程的一个原则。它 声明,在计算机程序中,如果S是T的子类型,那么 类型T的对象可以用类型S的对象替换(即, 类型S的对象可以替换类型为T)的对象而不改变 该程序的任何理想属性(正确性,任务 表演等。)
在面向对象编程中,依赖性反转原理 指特定形式的解耦软件模块。什么时候 遵循这一原则,传统的依赖关系 从高级别的政策制定模块建立到低级别, 依赖模块被反转(即反转),从而呈现 高级模块独立于低级模块实现 细节。原则陈述
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代理,这只能用于实现接口的类。