DI也就是依赖注入。几乎任何的功能我们都需要至少两个类以及更多的类相互合作才能完成,这样就会必然会造成一个类依赖另外一个类的现象(也就是耦合),如果耦合程度太高的话会让我们应用的后期维护变得非常困难。DI就是为了解决这个问题,下面举例来说明。
上面的代码中我省略了Person类。上面的代码有一个问题,PersonDaoBean与PersonServiceBean紧紧地绑在了一起,有一个PersonServiceBean就一定存在一个PersonDaoBean,这样的话PersonServiceBean同PersonDaoBean就紧密的耦合在一起了。我们可以使用接口来解决这个高度耦合问题。于是我们可以写出下面的
代码来实现这个功能。
将类的实现隐藏在接口后面,但是PersonServiceBean只能使用一种特定的方式来添加用户(这里是PersonDaoBean)。这个时候我们应该想,是应该让PersonServiceBean自己负责获取保存用户的方式还是应该给予PersonServiceBean保存用户的方式?为了解决这个问题,我们可以像下面这么修改。
注:让PersonServiceBean被动获得保存用户的的方式还有另外一种方式,那就是工厂模式。可以像下面这样实现
现在我们需要实现一个添加用户的功能,我们几乎可以很快的写出下面的代码。
public class PersonDaoBean {
public void add(){
System.out.println("添加一个人进来"); //添加一个用户
}
}
public class PersonServiceBean {
private PersonDaoBean personDao;
public PersonServiceBean {
personDao = new PersonDaoBean();
}
public void save(Person person){
personDao.save(person);
}
}
上面的代码中我省略了Person类。上面的代码有一个问题,PersonDaoBean与PersonServiceBean紧紧地绑在了一起,有一个PersonServiceBean就一定存在一个PersonDaoBean,这样的话PersonServiceBean同PersonDaoBean就紧密的耦合在一起了。我们可以使用接口来解决这个高度耦合问题。于是我们可以写出下面的
代码来实现这个功能。
public interface PersonDao {
public abstract void add();
}
public class PersonDaoBean implements PersonDao{
public void add(){
System.out.println("添加一个人进来"); //添加一个用户
}
}
public class PersonServiceBean {
private PersonDao personDao;
public PersonServiceBean {
personDao = new PersonDaoBean();
}
public void save(Person person){
personDao.save(person);
}
}
将类的实现隐藏在接口后面,但是PersonServiceBean只能使用一种特定的方式来添加用户(这里是PersonDaoBean)。这个时候我们应该想,是应该让PersonServiceBean自己负责获取保存用户的方式还是应该给予PersonServiceBean保存用户的方式?为了解决这个问题,我们可以像下面这么修改。
public interface PersonDao {
public abstract void add();
}
public class PersonDaoBean implements PersonDao{
public void add(){
System.out.println("添加一个人进来"); //添加一个用户
}
}
public class PersonServiceBean {
private PersonDao personDao;
public PersonServiceBean {
personDao = new PersonDaoBean();
}
public void save(Person person){
personDao.save(person);
}
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
}
现在PersonServiceBean是被动得到保存用户的方式的,你可以按自己需要的保存用户的方式给PersonServiceBean任何一种PersonDao的实现。这就是DI,这就是Spring所起的一个核心作用。注:让PersonServiceBean被动获得保存用户的的方式还有另外一种方式,那就是工厂模式。可以像下面这样实现
public class PersonServiceBean {
private PersonDao personDao;
public PersonServiceBean {
personDao = DaoFactory.getDao("personDao");
}
public void save(Person person){
personDao.save(person);
}
}
其中DaoFactory是一个工厂,"personDao"是一个properties文件中的一个键值对的键,我们如果要换一种保存用户的方式,只需要改变“personDao”对应的值(也就是接口personDao实现类的全名)就可以了。