为什么要使用接口的这种设计方式,这样有什么好处?

且看如下业务层实现类示例代码:

public class UserServiceImpl implements UserService {

private UserDAO userDAO;

public void setUserDAO(UserDAO userDAO){

this.userDAO=userDAO;

}

public void saveUser(User user) {

if(userDAO.findById(user.getId())==null)

userDAO.save(user);

}

...

}

问题:

1.为什么UserDAO接口没有声明具体的实现类,而在saveUser方法中却可以调用UserDAO接口中的方法?

业务层通过接口调用底层实现,具体的DAO实现类不会出现在我们的业务代码中,而是在配置文件中加以配置,这是Spring框架中控制反转(IOC)和依赖注入(DI)思想在技术上的一种实现机制,我们可以看到applicationContent.xml配置文件存在如下配置代码:

<!-- 配置数据持久层,把DAO注入给Session工厂 -->

<bean id="userDAO" class="com.integration.dao.UserDAOImpl" abstract="false" lazy-init="default" autowire="default">

<property name="sessionFactory"><ref bean="sessionFactory"/></property>

</bean>

 

2.为什么不直接实例化一个具体的实现类对象以供业务层调用,而要通过接口来实现?

我们知道在接口中声明的方法,可以在多个不同实现类实现这个接口的中方法,比如不同数据库的存取操作,可能就要对应多个不用的实现类,假如某项目在后续维护中需要更改数据库类型,那么只要添加一个实现类,然后在配置文件中修改实现类类名就可以了,不必打开原本的Java文件重写,这样便于后期对项目的维护。

posted @ 2015-09-01 10:02  一天一夜  阅读(1259)  评论(0编辑  收藏  举报