在MVC设计模式中,我们都知道controller层依赖service层,service层依赖dao层,我一直很好奇为什么不直接在service中new出一个dao实现类的实例,于是带着这个问题,我去网上找了一下答案,很多的答案都是各种官方的话语,而且复制粘贴的现象很严重,大多数都只是说如果要修改new出来的实现类的时候,会导致整个项目的更改变得麻烦,对于这样的解释,我还是不明白时什么意思。
知道我在百度知道上看到了一个例子能够很好的说明这一点:
首先我们定义一个Dao接口,假设接口中有一个selectXXX的获取数据库中数据的方法
interface xxxDao{
public int selectXXX(String id);
}
然后我们定义这个Dao接口的实现类:
class xxxDaoImpl{
@Override
public int selectXXX(String id){
return "取数据的方法一";
}
}
定义一个Test类来执行,我们通过new出一个dao的实现类对象出来:
public class Test{
public static void main(String[] args){
xxxDao dao = new xxxDaoImpl();
dao.selectXXX(1);
}
}
这样看起来没什么毛病。
但是如果有一个我想改变dao实现类的实现方式,新造出一个xxxDaoImpl2这个类出来,那么我们需要去每一个new出xxxDaoImpl的源文件中去修改这条语句,这样就很麻烦了。
但是如果我们用的时依赖注入的方式,我们只提供一个dao接口的引用,然后在程序运行时动态地将dao的实现对象注入到依赖它的类中,我们就解决了这个问题。