纸上得来终觉浅, 绝知此事要躬行
文章大纲
什么是 spring
传统 Java web 应用架构
更强的 Java Web 应用架构 --MVC 框架
Spring-- 粘合式框架
spring 的内涵
spring 核心
JavaBean
应用上下文
IoC/DI
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 实战(第四版)》 https://item.jd.com/11899370.html
Java 新手如何学习 Spring,Struts,Hibernate 三大框架
Spring 框架简介
Spring 框架介绍及使用
简述 什么是 spring MVC
来源: https://www.cnblogs.com/toSong/p/12207068.html