java web学习(进阶篇)一 从了解Spring开始

这系列博客是我在学习java web中的第二个系列的博客,主要涉及目前一些流行框架的使用与配合,相比基础篇而言更加深入也更有实战意义。下面就先从Spring开始介绍吧。

一 Spring简介

Spring 是最受欢迎的企业级 Java 应用程序开发框架。数以百万的来自世界各地的开发人员使用 Spring 框架来
创建好性能、易于测试、可重用的代码。它最初由Rod Johnson 创建。它是为解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。

Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。

二 框架特点

轻量

从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

控制反转

控制反转(IoC)技术促进了低耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。它与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

面向切面

通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。并不负责其它的系统级关注点,例如日志或事务支持。

容器

Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建,bean可以创建一个单独的实例或者每次需要时都生成一个新的实例

框架

Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。

MVC

客户端发送请求,服务器控制器(由DispatcherServlet实现的)完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller(相当于Action)在Spring 当中如果写一些处理器组件,一般实现Controller 接口,在Controller 中就可以调用一些Service 或DAO 来进行数据操作 ModelAndView 用于存放从DAO 中取出的数据,还可以存放响应视图的一些数据。 如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户。

所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

三 使用 Spring 框架的好处

• Spring 可以使开发人员使用 POJOs 开发企业级的应用程序。不需要EJB容器产品,比如一个应用程序服务器,但是可以选择使用一个健壮的 servlet 容器,比如 Tomcat 或者一些商业产品。

• Spring 在一个单元模式中是有组织的。即使包和类的数量非常大,你只需要你需要的,而忽略剩余的那部分。

• Spring 不会让你白费力气坐重复工作,它真正的利用了一些现有的技术,像几个 ORM 框架、日志框架、JEE、Quartz 和 JDK 计时器及其他视图技术。

• 测试一个用 Spring 编写的应用程序很容易,因为 environment-dependent 代码被放进了这个框架中。此外,通过使用 JavaBean-style POJOs,它在使用依赖注入注入测试数据时变得更容易。

• IOC 容器往往是轻量级的,例如,特别是当与 EJB 容器相比时。这有利于在内存和 CPU 资源有限的计算机上开发和部署应用程序。

• Spring 提供了一个一致的事务管理界面,该界面可以缩小成一个本地事务(例如,使用一个单一的数据
库)和扩展成一个全局事务(例如,使用 JTA)。

Spring中一些重要的概念

Spring 最认同的技术是控制反转的依赖注入(DI)模式。依赖注入是控制反转(IoC)的一个具体的例子。

当编写一个复杂的 Java 应用程序时,应用程序类应尽可能独立于其他的 Java 类,以增加这些类的可重用性,进行单元测试时,就可以使它们独立于其他类进行测试。

依赖注入有助于将这些类粘合在一起,并且在同一时间让它们保持独立。

什么是依赖注入(DI)?

依赖关系部分可以转化为两个类之间的关联。如,类 A 依赖于类 B。依赖注入则意味着类 B 将通过 IoC 被注入到类A 中。之后的博客会详细讲到。

面向切面程序设计(AOP)

一个程序中跨越多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。

在 OOP (面向对象程序设计)中模块化的关键单元是类,而在 AOP 中模块化的关键单元是方面。

AOP 帮助你将横切关注点从它们所影响的对象中分离出来,依赖注入则帮助你将应用程序对象从彼此中分离出来

Spring 的 AOP 模块提供了面向切面程序设计实现,允许你定义拦截器方法和切入点,可以实现将应该被分开的代码干净的分开。

Spring体系

Spring 是模块化的,允许你挑选适用于你的模块,不必把剩余部分引入。

Spring 框架提供的约 20 个模块:

java web学习(进阶篇)一 从了解Spring开始_第1张图片

1 核心容器层(Core Containner)

由核心,Bean,上下文和表达式语言模块组成:

核心(Core):提供框架的基本组成部分,包括 IoC 和依赖注入功能。

Bean:提供 BeanFactory,它是一个工厂模式的复杂实现。

上下文(Context):建立在核心和 Bean的基础上,访问定义和配置的任何对象的媒介。ApplicationContext 接口是此模块的重点。

表达式语言(SpEL):提供查询和操作一个对象图的强大表达式语言。

2 数据访问/集成层(Data Access/Integration)

包括 JDBC,ORM,OXM,JMS 和事务处理模块:

JDBC:提供删除冗余的 JDBC 相关编码的JDBC抽象层。

ORM:为流行的对象关系映射 API(包括 JPA,JDO,Hibernate 和 iBatis)提供了集成层。

OXM:提供了抽象层,支持对 JAXB,Castor,XMLBeans,JiBX 和 XStream 的对象/XML 映射实现。

JMS:Java 消息服务,包含生产和消费的信息功能。

事务处理:为实现特殊接口的类及所有的 POJO 支持编程式和声明式事务管理。

3 Web 层

由 Web,Web-MVC,Web-Socket 和 Web-Portlet模块组成:

Web:提供基本的面向 web 的集成功能,如:多个文件上传的功能和使用 servlet 监听器和面向 web 应用程序的上下文来初始化 IoC 容器。

Web-MVC:包含Spring的模型-视图-控制器(MVC),实现了 web 应用程序。

Web-Socket:为 WebSocket-based 提供支持,在 web 应用程序中提供客户端和服务器端之间的通信。

Web-Portlet:提供在 portlet 环境中实现 MVC,并反映 Web-Servlet 模块的功能。

4 其他

其他一些重要的模块,包括: AOP,Aspects,Instrumentation,Web 和测试模块:

AOP:提供面向切面编程实现,允许定义方法拦截器和切入点对代码进行干净地解耦,它实现了应该分离的功能。

Aspects:提供与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。

Instrumentation:在一定的应用服务器中提供类 instrumentation 的支持和类加载器的实现。

Messaging:为 STOMP 提供支持作为在应用中 WebSocket 子协议的使用。它也支持一个注解编程模型,为了选路和处理来自 WebSocket 客户端的 STOMP 信息。

测试模块:支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试。

开发环境与安装

1 开发环境搭建:

开发前需要安装JDK,Tomcat,请自行搜索,这里不再赘述。另外编译器我用的是 IDEA 14.0.2 而非Eclipse。

2 安装 Spring 框架库

从 http://repo.spring.io/release/org/springframework/spring 下载最新版本的 Spring 框架的二进制文件。我下载的是 spring-framework-4.2.4.RELEASE-dist.zip。

第一个spring程序

IoC容器

Spring 容器使用依赖注入(DI)管理组成一个应用程序的组件。这些对象称为 Spring Beans。

Spring IoC 容器利用 Java 的 POJO 类和配置元数据来生成完全配置和可执行应用程序。

下图说明Spring 如何工作:

java web学习(进阶篇)一 从了解Spring开始_第2张图片

Spring 提供两种不同类型的容器:

1 BeanFactory 容器:

(ioc-container/spring-bean-fatory-container.md)

最简单的容器,给 依赖注入(DI) 提供支持,用 org.springframework.beans.fa
ctory.BeanFactory 接口定义。BeanFactory 或相关接口,如 BeanFactory
Aware,InitializingBean,DisposableBean,仍保留在 Spring 中,主要目的是向后兼容已经存在的和 Spring 整合在
一起的第三方框架。

在 Spring 中,有大量对 BeanFactory 接口的实现。最常使用的是 XmlBeanFactory 类。它从 XML 文件中读取配置元数据,由这些元数据生成被配置化的应用。

2 ApplicationContext 容器

该容器可加载配置文件中定义的 bea
n,将所有的 bean 集中在一起,当有请求的时候分配 bean。 另外,它添加了更多的企业特定的功能,如:从属性文件中解析文本信息,发布应用程序事件给指定的监听器。由 org.springframew
ork.context.ApplicationContext 接口定义。

最常被使用的 ApplicationContext 接口实现:

• FileSystemXmlApplicationContext:从 XML 文件中加载已被定义的 bean。需要提供给构造器 XML 文件的完整路径

• ClassPathXmlApplicationContext:从 XML 文件中加载已被定义的 bean。不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可。

• WebXmlApplicationContext:在一个 web 应用范围内加载在 XML 文件中已被定义的 bean。

3 区别

ApplicationContext 容器包括 BeanFactory 容器的所有功能,通常使用ApplicationContext 容器。BeanFacto
ry 适用于轻量级应用,它的数据量和速度明显更好。在资源宝贵的移动设备或者基于 applet 的应用中, BeanFactory 会被优先选择。

4 实例

你可能感兴趣的:(java,spring,Web,开发框架)