今天来看一看Spring。
国内搞Java开发的朋友们,对Spring一定不会陌生。
谈起Spring,就会想起Ejb2.0。尽管,现实中有很多基于Ejb2.0的成功系统,但是Ejb2.0并没有实现它的最初设想:简化企业级应用开发。Ejb的声明式编程模式的确简化了很多基础架构层面的开发,比如事务、安全等等,但是Ejb2.0的模板式编码让人感到异常复杂。
为了简化Ejb,Spring诞生了。Spring以AOP和IOC为核心,为JavaBean提供了像Ejb一样强大的功能,这些技术为POJO提供了类似于Ejb的声明式编程模型,却没有引入任何Ejb的复杂性。
之后,Spring与Ejb相互学习,在Ejb3.0中,借鉴了Spring的轻量;而Spring借鉴了Ejb的分布式。不管Spring与Ejb是竞争还是合作吧,反正它们在简化我们的开发。
Spring是JavaEE开发中轻量级开源框架,以IOC(Inverse of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术。此外,Spring一个很大的特点,它并不像Ejb那样单打独斗,Spring集成了大量的第三方类库,用于和其他框架进行集成。真正实现面向接口编程。
Spring是一个开源项目,是一个中间件,更是一个框架。那我们为什么使用Spring呢?有人说:框架这种东西,最开始接触Java的时候,做好不要使用。还是要从Java基础的东西学起;有人说:Spring这个框架真是太棒了。它的IOC能够写出更加面向接口的程序;它的AOP是OOP的更好的一个补充。
对,这两种说法我都非常同意。为了更好的理解Spring,我们要掌握好Java的基础;而就工作编码而言,Spring确实是非常好的工具。所以,不同的阶段,不同的对待。
轻量——Spring是非侵入式的,也就是说,Spring应用中的对象不依赖Spring的接口或者抽象类。
IOC——提起IOC,我就会想起JNDI,JNDI是对象主动从容器中查找依赖;而IOC是指容器在对象初始化时不等对象请求就主动将依赖传递给它。Spring通过应用上下文(ApplicationContext)装载Bean的定义并把他们组装起来。ApplicationContext负责对象的创建和组装,然后主动注入给对象使用。
AOP——Spring提供了面向切面编程的支持,允许通过分离应用的业务逻辑与切入性服务(如事务管理、日志、权限)进行内聚行开发。
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一个容器。
框架——Spring可以简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式的组合,典型是在一个XML里面。
SpringMVC——类似于Struts2的一个web框架。
IOC
spring 核心模块实现了 IOC 的功能,用配置文件或者注解的方式,描述类之间的依赖关系,由IOC容器负责依赖类之间的创建、拼接、管理、获取等工作, BeanFactory 接口是Spring 框架的核心接口,它实现了容器许多核心的功能。
使用Spring,我们最主要使用的功能;Spring的其他功能,大多都是基于IOC的扩展。
Context 模块构建于核心模块之上,扩展了 BeanFactory 的功能,添加了UI支持、 Bean生命周期控制、框架事件体系、资源加载透明化等多项功能。此外,该模块还提供了许多企业级服务的支持,如邮件服务、任务调度、 JNDI 定位、 EJB 集成、远程访门等。
ApplicationContext是 Context 模块的核心接口。
Context是Spring做好的扩展,增强了Spring的功能。
数据访问/集成
数据访问/集成层包括JDBC,ORM,OXM,JMS和事务处理模块,每一个模板的功能如下
JDBC模块提供了不再需要冗长的JDBC编码相关了JDBC的抽象层。
ORM模块提供的集成层。流行的对象关系映射API,包括JPA,JDO,Hibernate和iBatis。
OXM模块提供了一个支持对象/ XML映射实现对JAXB,Castor,使用XMLBeans,JiBX和XStream 的抽象层。
Spring可以不用与Hibernate或者iBatis、myBatis集成,Spring内部集成了SpringJDBC模板,SpringJDBC也算是Spring旗下的一个很好用的Orm子框架;
此外,Spring也经常会与Hibernate、iBatis、myBatis集成。
Java消息服务JMS模块包含的功能为生产和消费的信息。
这是Spring扩展的对JMS的支持。
事务模块支持编程和声明式事务管理实现特殊接口类。
任何应用程序,其核心的问题是对数据的访问和操作。数据有很多表现形式,如数据表、XML、消息等,而每种数据形式又拥有不同的数据访问技术(如数据表的访问既可以直接通过JDBC,也可以通过Hirnate或iBatis)。
Spring站在DAO的抽象层面,建立了一套面向DAO层统一的异常体系,同时将各种访问数据的检查型异常转换为非检查型异常,为整合各种持久层框架提供基础。其次,Spnng通过模板化技术对各种数据访问技术进行了薄层的封装,将模式化的代码隐藏起来,使数据访问的程序得到大幅简化·这样,Spring就建立起了和数据形式及访问技术无关的统一的DAO层,借助AOP技术,Spring提供了声明式事务的功能。
SpringMVC
Spring的作用是整合,但不仅仅限于整合,Spring框架可以被看做是一个企业解决方案级别的框架。客户端发送请求,由DispatcherServlet完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping将请求映射到对应的处理器Controller(相当于Action),在Spring当中如果写一些处理器组件,一般实现Controller接口,在Controller中就可以调用一些Service来进行数据操作,ModelAndView用于存放dao中的数据,还可以存放相应视图的数据。如果想将处理结果返回给用户,那么在Spring框架中还提供了一个视图组件ViewResolver,该组件根据Controller返回的标示,找到对应的视图,将相应Response返回给用户。
SpringMVC是Spring旗下的子项目,与Struts2功能相仿,但是内部实现却大不相同。在与Spring集成方面,SpringMVC有着先天的优势,另外,也没有出现像Struts2那么多安全漏洞。现在越来越受到大家的青睐。
以上内容,多为参照网络上的资源:包括百度百科、开源中国、网友博客以及《Spring实战》等资料。之前打算偷偷懒不写总结的,看看书、看看资料就过去。不过,勿以善小而不为,勿以恶小而为之。所以,还是决定对这些知识做一个总结。