IOC/DI是什么(二)

在Spring中,所有的bean都在Spring容器中登记,Spring容器在程序运行到适当的时候,把当前对象需要的资源主动给当前对象,同时也把当前对象作为一种资源交给其他需要当前对象的对象,所有对象的创建、销毁都由Spring容器来控制。以前对象的生命周期,是由引用它的对象决定的,实际上也就是程序决定的,现在所有对象都由Spring容器来控制,控制权由程序代码交给了容器,这叫控制反转。

IOC的一个重点,是在系统运行期间,容器动态的向对象提供其所需的资源,也就是真正需要的时候,才给相应的资源,程序里不主动创建所需要的对象,也就不存在依赖,这样令项目中层与层之间、组件之间的耦合度变小了。旧的方式是在程序里主动new一个对象,这样就会形成依赖,导致系统的耦合度较高。

举个例子,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就是通过反射来实现依赖注入的。

总结:控制反转是什么?获取依赖对象的方式被反转了,依赖注入实际是另一种说法,或者说是另一个角度看待同一个问题。

猜你喜欢

转载自my.oschina.net/u/3733854/blog/1603632