在Spring中,全部的bean都在Spring容器中登记,Spring容器在程序运行到适当的时候,把当前对象须要的资源主动给当前对象,同时也把当前对象做为一种资源交给其余须要当前对象的对象,全部对象的建立、销毁都由Spring容器来控制。之前对象的生命周期,是由引用它的对象决定的,实际上也就是程序决定的,如今全部对象都由Spring容器来控制,控制权由程序代码交给了容器,这叫控制反转。数据库
IOC的一个重点,是在系统运行期间,容器动态的向对象提供其所需的资源,也就是真正须要的时候,才给相应的资源,程序里不主动建立所须要的对象,也就不存在依赖,这样令项目中层与层之间、组件之间的耦合度变小了。旧的方式是在程序里主动new一个对象,这样就会造成依赖,致使系统的耦合度较高。spa
举个例子,Dao层中有一个类A,包含了数据库CRUD操做的相应方法,A类首先须要一个Connection对象,才能完成CRUD操做,所以A依赖于Connection,旧的方式是在A中new一个Connection对象,这样A与Connection就产生了耦合,为何这么说呢?由于咱们须要在Dao层中去写一个获取Connection的实现类,这个类中包含了Connection须要的相关信息,好比数据库密码、用户名等,若是更换数据库,那么一定要改变相应的实现类,所以耦合度高。若是换成使用Spring容器来管理这些资源,在程序中,或者说在Dao层,则不须要写一个专门的类来获取Connection资源,在合适的时机,Spring容器会将Connection对象自动注入到A中,那么到底是如何实现DI(依赖注入)的呢?Java中有个概念叫反射,经过反射容许程序在运行中,动态的生成对象,执行对象方法,获取对象的属性。Spring就是经过反射来实现依赖注入的。对象
总结:控制反转是什么?获取依赖对象的方式被反转了,依赖注入实际是另外一种说法,或者说是另外一个角度看待同一个问题。生命周期