之前用了spring做了个小项目,一下子就觉得他非常方便有用,特意去研究下了这个框架,一下子就被它的巧妙所吸引到了!
首先我们来看看spring的ioc核心特性:
(1)什么叫做ioc和di?
答:ioc指的是控制控制反转,为什么说是控制反转呢?因为所谓的控制指的是对于对于接口的具体实现类的控制权,反转指的是将这种控制权转移到第三方或者外部类种,这样很明显的一个好处就是大大减少了程序的复杂度,并且能让程序员更加专注于业务逻辑,下面我们来看看一个例子:
public class Theater{ public void setOrder(){ //这里的话li这个人直接侵入了setOrder这个动作,因为本来我们只是要waiter这个角色去接受点单,并不应该确定好具体的人选 Waiter waiter = new Li(); waiter.say("ok"); } }
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文件对文档编辑提供诱导
答:不知道为什么思维导图不能传上去
(1)首先使用resourceLoader装载配置文件成resource类,然后使用beanDefinitionReader读取resource对象,得到一堆未加工的beanDefinition,然后放入到一个注册表中,以beanID为key
(2)调用工厂后处理器,主要有两个功能,一个是将beanDefinition中的占位符替换成真正的值,也就是它会加载外部文件,将里面的值对加载进容器里面,然后跟占位符进行比较,最后再设置进去,第二个是会利用java的反射机制将是properEditor的bean扫描出来然后放在一个注册表里面
(3)是初始化bean,此时的bean还未设置值,由beanWrapper将值设置进去
(4)将准备就绪的bean实例放入spring的缓冲池或者如果是原型的话就直接给调用者
原文地址:http://blog.csdn.net/carioo/article/details/45046533