Spring 框架学习(1)--Spring、Spring MVC扫盲
纸上得来终觉浅,绝知此事要躬行
文章大纲
- 什么是spring
- 传统Java web应用架构
- 更强的Java Web应用架构——MVC框架
- Spring——粘合式框架
- spring的内涵
- spring核心
- JavaBean
- 应用上下文
- IoC/DI
- spring框架组成
- spring还可以做什么
- spring核心
什么是Spring
Spring框架是Java平台的开源的全栈应用程序框架和控制反转容器实现。
传统的Java Web应用架构
传统的Java web框架一般分为两层:Contrller-Model。
控制器主要通过Servlet接收与处理请求,根据不同的Web请求生成动态内容。模型层主要处理与数据库的交互,接收控制器的请求,打包获得的数据返回给控制器。
主要流程如下:
- Web浏览器发送HTTP请求到服务器,被Controller(主要是Servlet)获取并进行处理
- Controller调用核心业务逻辑——Model
- Model进行数据库存取操作,并将结果返回给Controller
- Controller将业务逻辑处理结果交给View(通常是JSP),动态输出HTML内容
- 动态生成的HTML内容返回到浏览器显示
更强的Java Web架构——MVC框架(Spring MVC框架为例)
Spring MVC基于模型-视图-控制器(Model-VIew-Controller, MVC)模式实现,可以构建一个灵活和松耦合的Web应用程序,基于spring mvc架构的请求流程如下:
- 客户端产生请求,将数据提交给服务器。
- 经过前端控制器进行分发,通过查询处理器映射,将请求委托给应用程序的其他组件(控制器)来执行实际的请求。
- 控制器完成逻辑处理,产生响应信息(model),打包该模型数据,并标示逻辑视图名(用来确定用哪个视图渲染输出),将模型与视图名返回给前端控制器。
- 前端控制器使用视图解析器来将逻辑视图名匹配为一个特定的视图实现。
- 视图使用模型数据渲染输出,输出会通过响应对象传递给客户端。
Spring——粘合式框架
一站式的粘合框架,它像神奇的胶水一样,可以以松耦合的方式使各组件有机的粘合在一起。
Spring MVC完成用户请求并返回响应的过程中调用了大量的组件,而每个组件都有一个或多个JavaBean通过互相协调组合。为了降低耦合度,更方便、灵活的创建Bean以及Bean之间的联系,Spring采用了控制反转(Inverse of Controller,IoC)的思想,把强耦合的代码依赖从代码中移出去,放到统一的XML配置文件中,将程序对组件的主要控制权交给IOC容器,由IOC容器统一加载和管理,把Bean的创建、联系、属性分给Bean的过程,叫依赖注入(Dependency Injection, DI),由此可见,依赖注入与控制反转息息相关。
由此可见,Spring框架的核心技术思想是:控制反转/依赖注入。核心内容是:Bean。
Spring的内涵
Spring核心
JavaBean
Spring官方文档对于Bean的解释:
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
翻译:
组成应用程序主干部分并由Spring IoC容器管理的对象叫做beans。Bean是由Spring IoC容器实例化、组装、管理的对象。
总结概括:
- Bean是对象
- Bean是Spring应用程序的主干部分
- Bean由Spring IoC容器统一管理
Spring应用上下文
已经知道,Spring IoC容器具有对象的创建、管理等控制权,但是需要我们自己去放入对象到容器里,需要我们自己决定对象之间的依赖关系,总的来说,容器只是提供了一个管理对象的空间。我们需要通过Spring的应用上下文向容器添加代为管理的对象。
Spring应用上下文可以简单的理解为将需要Spring管理的对象放入容器的容器对象,也即,应用上下文是Spring容器的一种抽象化表述,上面代码使用的ApplicationContext本质上就是一个维护Bean定义以及对象之间协作关系的高级接口。
Spring的核心是容器,Spring容器使用DI管理构成应用的组件。Spring自带了多个容器实现,可以归为两种不同的类型。BeanFactory是最简单的容器,提供基本的DI支持。应用上下文基于BeanFactory构建,它提供更多服务,例如解析配置文本信息等等。
IoC/DI
Spring框架中的Bean不再是传统上的用new的方式创建了,而是通过把Bean的管理权限统一交由一个名为Spring IoC的容器统一管理,管理权限包括:实例化、配置和组装beans。Spring IoC容器通过读取配置元数据获取需要实例化、配置、组装的对象的信息。配置元数据信息通常以XML文件或Java注解或Java代码表示。
代码举例:
接口:
public interface HelloService { public void sayHello(); }
实现类:
public class HelloServiceImp implements HelloService { public void sayHello() { System.out.println("Hello World!"); } }
前面提到可以用三种方式配置元数据信息,这里采用XML的方式:
helloworld.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 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"> <!-- id 表示组件的名字,class表示组件类 --> <bean id="helloService" class="com.HelloServiceImpl" /> </beans>
实例化一个IoC容器:
public class HelloServiceTest { public void testHelloWorld() { // 1、加载Spring上下文,读取配置文件实例化一个IOC容器 ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml"); // 2、从容器中获取Bean HelloService helloService = context.getBean("helloService", HelloService.class); // 3、执行业务逻辑 helloService.sayHello(); } }
可以看到,顶层接口规定了方法,底下可以有各种打印输出不同内容的实现类。通过配置xml的方式,将实现类注册为一个具有特定ID的bean。在实例化容器部分,首先通过应用上下文读取了元数据信息,得到一个容器实例,然后获取到一个bean,并将这个bean注入到Service,Service再执行具体方法。可以看到,我们的Service并不需要知道它要打印输出的内容是什么,只需负责它本来的任务,各部分各司其职,互不干扰但却又互相配合。
Spring框架组成
Spring核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
面向切面编程:这个模块是Spring应用系统中开发切面的基础。AOP可以帮助应用对象解耦——将遍布系统的关注点(如:事务、安全等)从它们所应用的对象中解耦出来。
数据访问与集成:此模块抽象了大量样板式代码,使得数据库代码变得简单明了。Spring ORM模块建立再对DAO的支持之上,并为多个ORM框架(如:Hibernate、iBATIS SQL Maps等)提供了一种构建DAO的简便方式。
Web与远程调用:自带MVC框架——Spring MVC。集成RMI(Remote Method Invocation)、Hessian、Burlap、JAX-WS,自带远程调用框架——HTTP invoker。
测试:Spring为使用JNDI、Servlet和Portlet编写端元测试提供了一些列的mock对象实现。
Spring还可以做什么
Spring Portfolio包括多个构建于核心Spring框架之上的框架和类库。整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型。
Spring Boot:以Spring的视角,致力于简化Spring本身。Spring Boot大量依赖于自动配置技术,它能够消除大部分Spring配置。
Spring Web Flow:建立于Spring MVC框架之上,为基于流程的会话式Web应用(如购物车、向导等)提供了支持。
Spring Web Service:提供了契约优先的Web Service模型,服务的实现都是为了满足服务的契约而编写的。
Spring Security:利用Spring AOP,Spring Security为Spring应用提供了声明式的安全机制。
Spring Integration:为了方便应用直接的交互,Spring Integerration提供了多种通用应用集成模式的Spring声明式风格实现。
Spring Batch:适用于开发批处理应用,比如需要进行对数据的大量操作时。
Spring Data:不管使用的是文档数据库(如:MongoDB),图数据库(如:Neo4j),还是传统的关系型数据库,Spring Data都提供了一种简单的编程模型。
Spring Social:Spring Social更多的是关注connect而不是social,它能够帮助你通过REST API连接Spring应用。
Spring Mobile:是Spring MVC新的扩展模块,用于支持移动Web应用开发。
如有错误之处,请多多原谅并且提出来,一起进步??
文献参考:
《Spring实战(第四版)》
Java新手如何学习Spring、Struts、Hibernate三大框架
Spring框架简介
Spring框架介绍及使用
简述 什么是spring MVC