基于接口的编程,将服务端和数据库端完全隔离开,只由接口相联系。
如定义一个<bean>:
<bean id = "personDaoBean" class= "person.dao.impl.PersonDaoBean" />
<bean id = "helloBean" class= "output.test.impl.HelloBean" >
<property name = "personDao" ref= "personDaoBean" ></property >
</bean >
其中,第一个<bean>声明了一个类 PersonDaoBean,这是接口 PersonDao 的一个实现类。
第二个<bean>生命了一个类 HelloBean,这个类中定义了一个私有变量,变量类型便是接口 PersonDao。如果要想使用 PersonDaoBean 中的方法,就必须要向Spring容器指出,在第二个<bean>中,接口 PersonDao 的实现类是 PersonDaoBean。这就是<property>的作用,name 是第一个 bean 的 id, ref 是第一个 bean 的实现方法。
HelloBean 类:
public class HelloBean implements Hello {
private PersonDao personDao;
public PersonDao getPersonDao() {
return personDao;
}
public void setPersonDao( PersonDao personDao ) { //必须要有setter方法,否则注入不进去。相当于是将 PersonDaoBean 作为参数,来 set 接口 PersonDao。那么在后面,尽管是使用的接口的方法,但是实际上,执行的是 PersonDaoBean 中的方法。
this. personDao = personDao;
}
public void output(){
personDao.query();
System. out.println( "hello");
}
}
PersonDao 接口:
package person.dao;
public interface PersonDao {
public abstract void query();
}
PersonDaoBean 类:
package person.dao.impl;
import person.dao.PersonDao;
public class PersonDaoBean implements PersonDao {
public void query(){
System. out.println( "PersonDaoBean.query" );
}
}
这样,就实现了将 PersonDaoBean 注入到了 HelloBean 中。同时, HelloBean 中的代码仅仅提到了接口 PersonDao,没有出现过 PersonDaoBean。将基于实现类的耦合变成了基于接口的耦合。实际应用中,如果需求变了,可以很方便的换实现类,代码不用变。
IOC控制反转,就是指的将某一个接口的具体实现类的控制,从调用类中移除,转交给第三方(Spring容器)。