spring简介

前几篇介绍了spring的特性IOC与AOP,今天顺便把spring的整体给介绍一下。
spring等框架的初衷都是为了将重复的代码扔到框架中,通过配置文件就可以轻松启动,省却了大量的重复工作;spring的出现也是为了解决企业应用开发的复杂性,用基本的javaBean代替复杂的EJB,并提供了更多的企业应用功能;
而spring发展的比其他框架更快的原因则是因为:spring之所以与struts、hibernate等框架不同,是因为致力于提供一个统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合糅合在一起建立一个连贯的体系;与其它框架并不冲突;
spring中的原理不仅仅只是在服务器上开发(tomcat自动读取springContext文件,然后执行注入等操作),java应用也可以从中受益(可以直接读取文件,让各个类之间相互依赖);
把spring的优点说完了,我们说一下spring的原理吧,其实只要把spring的7个模块给搞清楚到底是干嘛的就OK了;
如图:
这里写图片描述
1.核心容器(BeanFactory)
核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。主要管理所注册的bean对象的属性以及它们之间的关系;IOC在这儿实现,就不再写一个模块了;具体IOC的信息,前面博客有写;
2.Spring 上下文(ApplicationContext)
Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
白话:Spring上下文其实就是生成一个环境,环境可以放置从核心容器中拿过来的bean对象、以及其他的企业服务;

spring的启动过程:
首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境;
其次,在web.xml中会提供有contextLoaderListener。在web容器启动时,会触发容器初始化事件,此时contextLoaderListener会监听到这个事件,其contextInitialized方法会被调用,在这个方法中,spring会初
始化一个启动上下文,这个上下文被称为根上下文,即WebApplicationContext,这是一个接口类,确切的说,其实际的实现类是XmlWebApplicationContext。这个就是spring的IoC容器,其对应的Bean定义的配置由web.xml中的context-param标签指定。在这个IoC容器初始化完毕后,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,将其存储到ServletContext中,便于获取;
再次,contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这个servlet可以配置多个,以最常见的DispatcherServlet为例,这个servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个servlet请求。DispatcherServlet上下文在初始化的时候会建立自己的IoC上下文,用以持有spring mvc相关bean。在建立DispatcherServlet自己的IoC上下文时,会利用
WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先从ServletContext中获取之前的根上下文(即WebApplicationContext)作为自己上下文的parent上下文。有了这个parent上下文之后,再初始化自己持有的上下文。这个DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化处理器映射、视图解析等。这个servlet自己持有的上下文默认实现类也是mlWebApplicationContext。
初始化完毕后,spring以与servlet的名字相关(此处不是简单的以servlet名为Key,而是通过一些转换,具体可自行查看源码)的属性为属性Key,也将其存到ServletContext中,以便后续使用。这样每个servlet就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享相同的bean,即根上下文(第2步中初始化的上下文)定义的那些bean。
说完了spring上下文的初始化过程,这三个上下文的关系应该就了解了。

读取spring的环境ApplicationContext的七个方法:http://www.tuicool.com/articles/7V3qIn
上下文参考(主要讲跟web容器一块儿使用时的启动步骤及原理):http://blog.csdn.net/crazylzxlzx/article/details/53648625
http://blog.csdn.net/yang123111/article/details/32099329
3.spring aop(前面博客中有讲,就不说了)
4.spring dao
因为之间用spring框架的时候都是把dataSource注入进来,还以为dao不就把数据库实例注入进来吗,这跟第一个beanFactory一样了,为什么药列出来呢
其实不然,JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写 的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
它处理的主要是处理数据库的什么连接、异常处理、关闭等事;
5.Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

6.Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
7.spring MVC
MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
这个框架的东西有点儿多,就不细讲了,这儿有篇博客不错:http://www.cnblogs.com/baiduligang/p/4247164.html
其它:
1.beanFactory与spring上下文ApplicationContext的区别:

与BeanFactory不同的是,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。而BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配。
在Java项目中通过ClassPathXmlApplicationContext类手动实例化ApplicationContext容器通常是不二之选。

但对于Web项目就不行了,Web项目的启动是由相应的Web服务器负责的,因此,在Web项目中ApplicationContext容器的实例化工作最好交给Web服务器来完成。
2.spring上下文:上下文是什么意思呢,在各个领域内具体的定义都不同,其实都是从context中翻译过来的,在java中,其实就是一个环境(储存区域),存放了各个传过来的属性值(在spring中,其实就是从配置文件springContext读过来的属性。
3.spring容器(beanFactory)和上下文(ApplicationContext)侧重点不同,一个是自身bean,一个是引入其他的,context中的信息都是容器提供的,context是作为公共环境存放执行信息;区分清楚;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值