IOC(Inversion of Control) ,所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。
如下面的程序:
public class PersonServiceBean {
private PersonDAO personDAO = new PersonDAOBean();
public void save() {
personDAO.add();
}
}
PersonDaoBean 是在应用内部(即PersonServiceBean类)创建及维护的。
当我们把依赖对象交给外部容器负责创建,那么PersonServiceBean 类可以改成如下:
package org.spring.service.impl;
import org.spring.dao.PersonDAO;
import org.spring.service.PersonService;
public class PersonServiceBean implements PersonService {
//实现接口编程,PersonServiceBean不负责依赖对象的创建及维护,
//依赖对象的创建及维护是由外部容器(这里指的是spring容器)负责的
private PersonDAO personDAO;
public PersonDAO getPersonDAO() {
return personDAO;
}
public void setPersonDAO(PersonDAO personDAO) {
this.personDAO = personDAO;
}
public void save() {
personDAO.add();
}
}
PersonService接口:
package org.spring.service;
public interface PersonService {
public void save();
}
PersonDAO接口:
package org.spring.dao;
public interface PersonDAO {
public void add();
}
PersonDAOBean实现类:
package org.spring.dao.impl;
import org.spring.dao.PersonDAO;
public class PersonDAOBean implements PersonDAO {
public void add() {
System.out.println("执行PersonDAOBean中的增加方法!");
}
}
当然为了能让容器能管理我们的bean,我们还需要在spring中做如下配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="personDAOBean" class="org.spring.dao.impl.PersonDAOBean" /> <bean id="personServiceBean" class="org.spring.service.impl.PersonServiceBean"> <property name="personDAO" ref="personDAOBean" /> </bean> </beans>
Spring容器在启动后,就会对配置文件中的所有bean进行初始化,并且把id为personDAO的bean注入到id为personServiceBean的bean中,这样personServiceBean就不用负责对personDAObean的创建及维护了,这项工作在容器初始化时就已经完成了,配置文件中的property中的name属性指的是id为personServiceBean的bean中有一个setPersonDAO方法。
测试类:
package org.spring;
import org.junit.Test;
import org.spring.service.PersonService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
@Test
public void test() {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"spring.xml");
PersonService personService = (PersonService) ctx
.getBean("personServiceBean");
personService.save();
}
}
控制台打印结果如下:
工程目录结构图: