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 框架学习(1)--Spring、Spring MVC扫盲的更多相关文章
- Spring框架学习之--搭建spring框架
此文介绍搭建一个最最简单的spring框架的步骤 一.创建一个maven项目 二.在pom.xml文件中添加依赖导入spring框架运行需要的相关jar包 注意:在引入jar包之后会出现org.jun ...
- Spring框架学习总结(上)
目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...
- Spring框架学习1
AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理 Spring框架学习(一) 阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...
- Spring框架学习笔记(5)——Spring Boot创建与使用
Spring Boot可以更为方便地搭建一个Web系统,之后服务器上部署也较为方便 创建Spring boot项目 1. 使用IDEA创建项目 2. 修改groupid和artifact 3. 一路n ...
- Spring框架学习笔记(1)
Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...
- Spring框架学习一
Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...
- spring框架学习(三)junit单元测试
spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...
- spring 框架学习网站
spring 框架学习网站 NO1 http://www.mkyong.com NO2 https://spring.io/docs/reference
- Spring框架学习
没有状态变化的对象(无状态对象):应当做成单例. Spring-framework的下载:http://repo.spring.io/release/org/springframework/sprin ...
- Spring框架学习之IOC(二)
Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...
随机推荐
- 试用ZooKeeper
ZooKeeper下载 通过ZooKeeper官网下载最新的稳定版本 解压ZooKeeper到某个目录,其目录结构为: 运行环境要求 系统环境 ZooKeeper对于市面上各种操作系统都有了不错的支持 ...
- 安装node-sass时出现的错误解决方案(Mac自用,也可以借鉴)
安装node-sass时出现一下错误: gyp ERR! configure error gyp ERR! stack Error: EACCES: permission denied, mkdir ...
- H3C IEEE EUI-64格式
- junit 测试套件Suite
junit测试套件,就是可以运行一个测试类使得一个或一些测试类被junit测试运行 见代码: 测试套件类: import org.junit.runner.RunWith; import org.ju ...
- Linux 内核USB 驱动
通用串行总线(USB)是一个在主机和许多外设之间的连接. 最初它被创建来替代许多慢速和不同的总线- 并口, 串口, 和键盘连接--有一个单个的所有设备都可以连接的总线类型.[45] USB 已经成长超 ...
- dotnet 非泛型 类型 System.Collections.IEnumerable 不能与类型实参一起使用
如果在开发的时候遇到非泛型 类型"IEnumerable"不能与类型参数一起使用,那么就是变量的命名空间没弄对 在 dotnet 里面有 System.Collections.IE ...
- 破解第一个程序----分析APK文件
反编译APK成功后,在outdir目录下会生成一系列目录与文件. smali:程序所有的反汇编代码: res:程序中所有的资源文件: 如何寻找突破口是分析程序的关键.错误提示一般是指引关键代码的风向标 ...
- HDU1556 Color the ball & 牛客 contest 135-I 区间 [差分标记]
一.差分标记介绍 差分标记用来解决针对区间(修改-查询)的问题,复杂度比线段树要更低.推荐这个博客. 例如,给数组中处于某个区间的数进行加减操作,然后查询某个位置上数的变化值. 二.HDU1556 C ...
- KEIL5.11安装小结
一.注意点 1.安装路径不能带中文,必须是英文路径 2.安装目录不能跟 51 的 KEIL 或者 KEIL4 冲突,三者目录必须分开 3.KEIL5 不像 KEIL4 那样自带了很多厂商的 MCU 型 ...
- 阿里巴巴java开发手册学习记录,php版
一.编程规约 (一)命名风格 1.目录使用小写+下划线 home,view,model,admin_view 2.类 UpperCamelCase PhpMailer方法 lowerCamelCase ...