Spring里有一个很重要的概念.叫作IOC
那么什么是IOC呢?
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。 控制反转还有一个名字叫做依赖注入(Dependency Injection),简称DI。
应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。
Class A{
AInterface a;
A(){}
aMethod(){
a = new AInterfaceImp();
}
}
ClassA与AInterfaceImp就是依赖关系,如果想使用AInterface的另外一个实现就需要更改代码了。当然我们可以建立一个Factory来根据条件生成想要的AInterface的具体实现,即:
InterfaceImplFactory{
AInterface create(Object condition){
if(condition = condA){
return new AInterfaceImpA();
}elseif(condition = condB){
return new AInterfaceImpB();
}else{
return new AInterfaceImp();
}
}
}
以上的代码我们可以看到, 当我们在A类中需要AInterface的一个实例的时候,我们需要根据不同的条件来创建不同的实现实例,那么Spring就是将这些判断条件放在了XML文件里. 通过一个IOC容器,在我们需要的时候,就把接口的实现注入到需要他的类里,以达到我们的要求.
看一看Spring的配置文件:
<bean id="userDao"
class="com.ssh.dao.impl.UserDaoImpl">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<bean id="userDao1"
class="com.ssh.dao.impl.UserDao1Impl">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<bean id="userService"
class="com.ssh.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
Spring是一个大工厂,帮我们生产出我们需要的各种bean.所有的有定义在xml文件中的bean都会帮我们创建.例如spring在创建userService的时候,就会查找到属性userDao, 这个时候, ioc就出现了. ioc容器就会按照这个名称去找到相应的userDao bean,然后利用反射创建一个userDao的实例, 当我们这个时候需要另外的一个userDao1, 那么我们就只用更改xml的配置文件. 只用把userService中的属性引用改为userDao1, 这样在我们在userService中取到的就是UserDao1Impl的实例, 这样我们就可以调用该实例里的方法了.这样就提高灵活性和可维护性