码迷,mamicode.com
首页 > 编程语言 > 详细

spring的ioc原理

时间:2015-04-14 21:43:44      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:spring   ioc   web应用   

之前用了spring做了个小项目,一下子就觉得他非常方便有用,特意去研究下了这个框架,一下子就被它的巧妙所吸引到了!

首先我们来看看spring的ioc核心特性:

(1)什么叫做ioc和di?

答:ioc指的是控制控制反转,为什么说是控制反转呢?因为所谓的控制指的是对于对于接口的具体实现类的控制权,反转指的是将这种控制权转移到第三方或者外部类种,这样很明显的一个好处就是大大减少了程序的复杂度,并且能让程序员更加专注于业务逻辑,下面我们来看看一个例子:

public class Theater{
	public void setOrder(){
		//这里的话li这个人直接侵入了setOrder这个动作,因为本来我们只是要waiter这个角色去接受点单,并不应该确定好具体的人选
		Waiter waiter = new Li();
		waiter.say("ok");
	}
}

所以这里更好的应该是使用一个外部类去决定waiter具体指向的对象,而只是让waiter去实现接受订单的剧情

DI:表示的是在运行时注入依赖对象。因为applicationContext这个spring容器是在初始化bean的实例的时候会将所有的bean在一开始全部初始化,所以当你在xml或者annotation中配置好依赖关系,spring容器会使用beanWrapper这个组件使用java的反射将bean之间的依赖关系和值通过三种注入方式设置好

(2)spring中的资源是以什么形式存在?

答:spring中的资源,比如classpath,file,url等都是实现了一个resource接口,然后所有的资源都是resource的具体实现类,spring使用一个resourceLoader去读取resource,然后生成beandefiniton,每一个beanDefinition对应于一个bean结点,然后都放在一个注册表中

(3)spring容器有几种,他们有什么不同?

答:一般而言我们称beanFactory为ioc容器,而ApplicationContext为spring容器,应用上下文是在beanFactory之上的一个容器,提供了更多的功能。

还有一个特殊针对于web层的webApplicationContext,它允许从相对于web根目录的路径中装配配置文件完成初始化工作(springmvc就是里面典型代表),可以得到ServletContext的引用(request,response,session),里面是将整个web应用上下文对象作为属性放置在ServletContext中,以一个ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE常量为键,应用上下文为值放置在ServletContext的属性表里面

我们可以用contextConfigLocation去启动web容器:

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
	/WEB-INF/bao-dao.xml
	</param-value>
</context-param>

<listener>
	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
BeanFactory和ApplicationContext最大的不同在于,应用上下文会自动使用java的反射机制扫面Beandefinition的注册表,将后处理器的bean扫出来并且利用java的反射机制自动注册号,而beanFactory却必须手工地使用addBeanPostProcesser()进行注册

(4)spring配置里面是什么意思?

答:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" //默认空间名,指的是<bean>这种
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	p是别名,后面的字符串是全名
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd    
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd    
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
    后面的这个schemaLocation是上面的schema文件,ide可以引用schema文件对文档编辑提供诱导

(5)spring容器里面究竟是怎么工作的?

答:技术分享不知道为什么思维导图不能传上去

技术分享技术分享



(1)首先使用resourceLoader装载配置文件成resource类,然后使用beanDefinitionReader读取resource对象,得到一堆未加工的beanDefinition,然后放入到一个注册表中,以beanID为key

(2)调用工厂后处理器,主要有两个功能,一个是将beanDefinition中的占位符替换成真正的值,也就是它会加载外部文件,将里面的值对加载进容器里面,然后跟占位符进行比较,最后再设置进去,第二个是会利用java的反射机制将是properEditor的bean扫描出来然后放在一个注册表里面

(3)是初始化bean,此时的bean还未设置值,由beanWrapper将值设置进去

(4)将准备就绪的bean实例放入spring的缓冲池或者如果是原型的话就直接给调用者

spring的ioc原理

标签:spring   ioc   web应用   

原文地址:http://blog.csdn.net/carioo/article/details/45046533

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!