深入了解spring的ioc

来源:互联网 发布:织梦 编辑器字体修改 编辑:程序博客网 时间:2024/04/27 02:19
在学习spring中IOC是其比较重要的一部分,也连贯着aop的实现。
那我们就深入来了解下spring的IOC;
IOC究竟是什么?
Ioc—Inversion of Control,即“控制反转”;它不是一种技术,他是一种思想的改变;在我们应用程序中,在a类里面,实现b类相关的方法,怎么做呢;直接的方法是人为主动的在a类里面直接new出b类的对象来实现,这样就使b类与a类相关联起来了,就形成了耦合,不便于移植与扩展。而IOC恰恰相反,不在是人为的为a类添加b类的对象,而是a类被动的接受容器为它添加的b类对象;来注入进去;它们之间没有任何耦合度!


IOC是怎么知道它们之间有依赖关系的呢?
IOC判断它们之间是否存在依赖关系,是通过读取配置xml文件来判断的!
什么样的xml配置文件?
<beans>
<!-- 添加sessionFactory bane ,注意,该类是Spring提供的 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" scope="prototype">
<!-- 注入Hibernate 配置文件路径,前面要加上  classpath:-->
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>


<!-- 把sessionFactory 注入给IndexDao -->
<!-- IndexDao=new ssh.dao.IndexDaoImpl-->
<bean id="IndexDao" class="ssh.dao.IndexDaoImpl" scope="prototype">
<property name="sessionFactory" ref="sessionFactory" />
</bean>


<!-- IndexService = new ssh.service.IndexServiceImpl() -->
<bean id="IndexService" class="ssh.service.IndexServiceImpl" scope="prototype">
<property name="id" ref="IndexDao"/>//把上面创好的IndexDao注入在IndexService里
</bean>


<!-- 把IndexService 注入给IndexAction-->
bean id="IndexAction" class="ssh.action.IndexAction" scope="prototype">
<property name="is" ref="IndexService"/>//把上面创好的IndexService注入在IndexAction里
</bean>
</beans>


这就是所配置的依赖关系!即怎么注入进去的流程!现在你应该知道IOC是怎么判断类之间的依赖关系,及怎么注入的吧!


我们在深入了解
spring当读取这些xml配置文件时,是怎样实现在应用程序组件里去的呢?
那我们必须反过来再剖析下IOC容器;
我借其他LZ的话:
IoC容器就是具有依赖注入功能的容器,IoC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中new相关的对象,应用程序由IoC容器进行组装。在Spring中BeanFactory是IoC容器的实际代表者。
Spring IoC容器如何知道哪些是它管理的对象呢?这就需要配置文件,Spring IoC容器通过读取配置文件中的配置元数据(就是上面<bean>里面的数据),通过元数据对应用中的各个对象进行实例化及装配。一般使用基于xml配置文件进行配置元数据,而且Spring与配置文件完全解耦的,可以使用其他任何可能的方式进行配置元数据,比如注解、基于java文件的、基于属性文件的配置都可以。
那Spring IoC容器管理的对象叫什么呢?
IoC容器管理的那些组成你应用程序的对象我们就叫它Bean, Bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。那IoC怎样确定如何实例化Bean、管理Bean之间的依赖关系以及管理Bean呢?这就需要配置元数据,在Spring中由BeanDefinition代表,配置元数据指定如何实例化Bean、如何组装Bean等(见http://jinnianshilongnian.iteye.com/blog/1413851有详细讲解及简单列子)
当你把上面链接里面的东西看完后,你就知道spring IOC是怎样读取xml文件里的元数据到解析元数据的了!


然后我们在深入进去。配置里的<bean>标签是怎么样生成的呢?<bean>与<bean>存在着哪些关系! 这里我也不重要讲解啦;如果感兴趣!
可以去LZ哪里看看:http://jinnianshilongnian.iteye.com/blog/1413857


通过上面的讲解,我们有个较为详细的概念了。


何为控制反转:在对象中创建关系对象时,由ioc容器来帮忙实例化创建对象并使程序被动的接收注入依赖对象,不由程序去主动创建获取;


何为控制正转:在对象中创建关系对象时,由我们自己在对象中主动控制去直接获取依赖对象


ioc控制反转流程:spring里的ioc容器通过beanfactory相关api解析xml配置文件里相关的<bean>元数据,通过解析得到的数据判断程序中哪些类需要注入依赖对象;则ioc容器实例化它们需要注入的依赖类,并定为到需要的类里面,把创建好的对象依赖注入到指定的应用程序对象里的过程!



我们再来讲讲依赖注入(DI)
传统应用程序设计中所说的依赖一般指“类之间的关系“


观LZ的帖子,还有实例,能更快的加速你的理解:
http://jinnianshilongnian.iteye.com/blog/1415277















1 0