控制反转,也可称之为依赖注入。就我而言,可能依赖注入这个概念 更容易理解一些,通常有三种注入方式,构造函数、工厂方法的参数、设置对象值属性(也就是setter()方法)。
依赖注入/控制反转。基本原理上因该是对象之间的依赖关系。简化点来理解,就是依赖什么,我就反过来将其注入,而不在被依赖对象里去创建。比如,人(peason类)开车(car类),那么可以理解为peason类依赖car类,可以向下引申到对象,peason类的对象driver依赖于car类的对象truck(卡车)。
通常情况下的代码:
在这里,driver的依赖对象truck由自己创建,耦合度很高。比如,现在司机不开卡车改开拖拉机,那么类peason的代码就需要修改,不易维护。
现在依据依赖注入的原则修改优化一下,代码:
修改成这样,调用方法
car mycar = new car("拖拉机");
peason driver = new peason(mycar);
driver.driver();
至此,一个最简单的构造函数注入便完成了。将要开的车注入进peason类的对象,控制从根本上发生了倒转,这就是控制反转。
当然,还可以用设置值对象的方法,稍微修改上面代码:
调用,则修改为,
car mycar = new car("拖拉机");
peason driver = new peason();
driver.setCar(mycar);
driver.driver();
以上是spring的依赖注入的基本原理,但spring更牛X,它提供一个非常成熟的容器来实现IoC。我们可以将需要的依赖关系按spring的规则配置进XML里,通过BeanFactory自动的实现注入过程。
在上面bean.xml中,myCar bean的class属性truck为car的实现类,并且,在spring2中,用户可以开发自定义标签,增强了扩展性。
如果这个xml名字为bean.xml,那么调用过程:
ApplicationContext context = new ClassPathXmlApplicationContext(
new String [] {"bean.xml"}) //这里支持从多个xml中读取bean定义
BeanFactory factory = new BeanFactory(context);
peason driver = factory.getBean("peason");
driver.driver():
这里是以属性方式注入,还可以用构造器方式注入,由于篇幅问题,详细内容在下一篇笔记中阐述。
依赖注入/控制反转。基本原理上因该是对象之间的依赖关系。简化点来理解,就是依赖什么,我就反过来将其注入,而不在被依赖对象里去创建。比如,人(peason类)开车(car类),那么可以理解为peason类依赖car类,可以向下引申到对象,peason类的对象driver依赖于car类的对象truck(卡车)。
通常情况下的代码:
public
class
peason
{
void driver(){
car truck = new car("truck");
truck.加油;
truck.挂挡;
……
}
}
void driver(){
car truck = new car("truck");
truck.加油;
truck.挂挡;
……
}
}
现在依据依赖注入的原则修改优化一下,代码:
public
class
peason
{
private car Mycar;
public peason (Mycar mycar){
Mycar = mycar;
}
void driver(){
Mycar.挂挡;
Mycar.加油;
}
}
private car Mycar;
public peason (Mycar mycar){
Mycar = mycar;
}
void driver(){
Mycar.挂挡;
Mycar.加油;
}
}
car mycar = new car("拖拉机");
peason driver = new peason(mycar);
driver.driver();
至此,一个最简单的构造函数注入便完成了。将要开的车注入进peason类的对象,控制从根本上发生了倒转,这就是控制反转。
当然,还可以用设置值对象的方法,稍微修改上面代码:
public
class
peason
{
private car Mycar;
public peason ()
{
//Mycar = mycar;
}
void driver(){
Mycar.挂挡;
Mycar.加油;
}
public void setCar(car mycar){
this.Mycar = mycar;
}
}
private car Mycar;
public peason ()
{
//Mycar = mycar;
}
void driver(){
Mycar.挂挡;
Mycar.加油;
}
public void setCar(car mycar){
this.Mycar = mycar;
}
}
car mycar = new car("拖拉机");
peason driver = new peason();
driver.setCar(mycar);
driver.driver();
以上是spring的依赖注入的基本原理,但spring更牛X,它提供一个非常成熟的容器来实现IoC。我们可以将需要的依赖关系按spring的规则配置进XML里,通过BeanFactory自动的实现注入过程。
<?
xml version="1.0" encoding="GBK"
?>
<! DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd" >
< bean id ="myCar" class ="truck" />
< bean id ="peason" class ="peason" >
< property name ="car" ref ="myCar" />
</ bean >
<! DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd" >
< bean id ="myCar" class ="truck" />
< bean id ="peason" class ="peason" >
< property name ="car" ref ="myCar" />
</ bean >
如果这个xml名字为bean.xml,那么调用过程:
ApplicationContext context = new ClassPathXmlApplicationContext(
new String [] {"bean.xml"}) //这里支持从多个xml中读取bean定义
BeanFactory factory = new BeanFactory(context);
peason driver = factory.getBean("peason");
driver.driver():
这里是以属性方式注入,还可以用构造器方式注入,由于篇幅问题,详细内容在下一篇笔记中阐述。