乐趣区

关于spring:Spring基础

Spring 框架的构造

Spring 是一个轻量级管制反转 (IoC) 和面向切面 (AOP) 的容器框架

下图是 Spring 官网给出的 Spring 框架的结构图

从图中咱们能够看到 Spring 的四大局部:外围容器(container)、AOP 模块、Web 模块、Data 模块

  • 首先看外围容器,从外围俩字咱们能够看出,这是 Spring 最重要的局部。次要的性能是实现了管制反转(IOC)与依赖注入(DI)、Bean 配置、加载以及生命周期的治理。
  • AOP 模块:负责 Spring 的所有 AOP(面向切面)的性能。
  • Web 模块:扩大了 Spring 的 Web 性能。使其合乎 MVC 的设计规范,最重要的是提供了 Spring MVC 的容器。
  • Data 模块:提供了一些数据相干的组件:包含 JDBC、orm(对象关系映射)、事务操作、oxm(对象 xml 映射)、Jms(Java 音讯服务)。

各个模块介绍

  • spring core:提供了框架的根本组成部分,包含管制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)性能。
  • spring beans:提供了 BeanFactory,是工厂模式的一个经典实现,Spring 将治理对象称为 Bean。
  • spring context:构建于 core 封装包根底上的 context 封装包,提供了一种框架式的对象拜访办法。
  • spring jdbc:提供了一个 JDBC 的形象层,打消了繁缛的 JDBC 编码和数据库厂商特有的错误代码解析,用于简化 JDBC。
  • spring aop:提供了面向切面的编程实现,让你能够自定义拦截器、切点等。
  • spring Web:提供了针对 Web 开发的集成个性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。
  • spring test:次要为测试提供反对的,反对应用 JUnit 或 TestNG 对 Spring 组件进行单元测试和集成测试。

咱们能够看到 Spring 给咱们提供的模块相当的丰盛,无论是 长久层、业务层 还是 管制层 都有所波及。

  1. Spring 简直包揽除了业务逻辑之外的的所有工作,包含日志治理、事务管理、Bean 治理、平安治理等。
  2. Spring 致力于全套的 Java 问题的解决方案,在所有的 Java 能够涉足的畛域,Spring 都会提供相应的反对。(即便没有反对,也会让咱们去整合)
  3. 与第三方框架的整合。在我的了解中 Spring 框架就像一个插线板,而第三方框架就相当于插头,能够轻易地与它组合在一起。须要的时候就插上去,不须要的时候就拔掉,相当的不便。

既然 Spring 如此的不便,那么它又是如何做到的呢?

很简略,通过两点:

  • 管制反转(IOC)
  • 面向切面编程(AOP)

为了升高 Java 开发的复杂性,Spring 采取了以下 4 种要害策略

  • 基于 POJO 的轻量级和最小侵入性编程;
  • 通过依赖注入和面向接口实现松耦合;
  • 基于切面和常规进行申明式编程;
  • 通过切面和模板缩小样板式代码。

Spring 框架中都用到了哪些设计模式?

  • 工厂模式:BeanFactory 就是简略工厂模式的体现,用来创建对象的实例;
  • 单例模式:Bean 默认为单例模式。
  • 代理模式:Spring 的 AOP 性能用到了 JDK 的动静代理和 CGLIB 字节码生成技术;
  • 模板办法:用来解决代码反复的问题。比方. RestTemplate, JmsTemplate, JpaTemplate。
  • 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态产生扭转时,所有依赖于它的对象都会失去告诉被制动更新,如 Spring 中 listener 的实现–ApplicationListener。

应用 Spring 有哪些形式?

  • 作为一个成熟的 Spring Web 应用程序。
  • 作为第三方 Web 框架,应用 Spring Frameworks 中间层。
  • 作为企业级 Java Bean,它能够包装现有的 POJO(Plain Old Java Objects)。
  • 用于近程应用。

管制反转(IOC)/ 依赖注入(DI)

既然说到管制反转,那么咱们不禁要问什么管制被反转了?
答案是:咱们对对象的控制权被反转了。咱们将对象的管制交给了Spring 的容器

那么问题又来了,什么是 Spring 的容器?
简略的说,Spring 容器就是一个超级大工厂,负责创立、治理所有的 Java 对象,这些 Java 对象被称为 Bean。Spring 容器治理着容器中 Bean 之间的依赖关系,Spring 应用一种被称为“依赖注入”的形式来治理 Bean 之间的依赖关系。

什么又是 依赖注入 呢?
依赖注入(DI)就是管制反转的一种实现模式,Spring 容器也是通过这种模式治理 Bean 的。

Spring 容器如何做到替你治理这些 bean 的呢?
工厂模式。

Spring 框架费了九牛二虎之力创立一个 Spring 容器去帮咱们治理这些 Bean 又有什么益处呢?
其实和工厂模式的益处差不多:

  • 解除硬编码耦合,利于我的项目降级和保护;
  • 简化了对象的治理,使咱们更加专一于业务操作;

聊完了管制反转咱们再来看看 Spring 框架的另一项关键技术 AOP。

面向切面编程(AOP)

什么是面向切面编程?

面向切面编程:在运行时,动静地将代码切入到类的指定办法、指定地位上的编程思维就是面向切面的编程。

这句话读完预计跟没读没什么区别,还是没懂。上面咱们来看一张图:

从图中咱们能够看出:咱们每写一个业务性能,都须要判断权限、记录日志、提交事务、这些逻辑是不是都是反复的呀,这相当于什么呢?相当于咱们后面说的脏活累活,这都不是咱们的重点,咱们的重点是业务逻辑,就是说咱们须要把整体框架搭好,理论编写的时候只须要将咱们的业务代码切入到框架之中,就行了。

原理:代理模式。

为什么须要 AOP?
AOP 专门用于解决零碎中散布于各个模块或者不同办法中的穿插关注点的问题。比方:在程序中,咱们经常须要解决一些具备横切性质的零碎级服务,如事务管理、安全检查、缓存、对象池治理等,AOP 是一种十分罕用的解决方案。

面向切面编程对咱们来说有什么益处?

  1. 缩小反复;
  2. 专一业务;

留神:面向切面编程只是面向对象编程的一种补充。

长处

  1. Bean 的对立治理,升高了对象之间的耦合
  2. 对支流的框架提供了很好的集成反对
  3. 提供泛滥组件,事务管理,JDBC 等
  4. 具备高度可开放性,开发者能够自由选择 Spring 局部或全副
  5. 次要应用工厂模式和代理模式。
  6. 低侵入,代码净化极低。(咱们不会因为用了 spring 而影响咱们的失常的业务逻辑)
  7. AOP 的很好反对,方便面向切面编程(AspectJ)。

Spring MVC

聊完了 Spring,咱们来看看 Spring 在 web 方面的利用 Spring MVC。

MVC

首先咱们来看什么是 mvc?

大家晓得在 jsp 外面也是能够写 java 代码的,然而如果咱们这样做就会有一个问题,就是代码全副都杂糅在一起,无论是浏览还是批改都将变得非常的艰难。

MVC 是模型 (model)-视图(view)-控制器(controller) 的缩写,他将咱们的程序分为个三局部,页面、管制层、模型层。这样使咱们的程序的逻辑更清晰,更容易保护。

它以将咱们的业务逻辑、数据与界面显示拆散,将泛滥的业务逻辑汇集到一个部件外面,在须要改良和个性化定制界面及用户交互的同时,不须要从新编写业务逻辑,进步编码效率。

Spring MVC

Spring MVC 是 MVC 构造在 Spring 框架中的一种表现形式。上面咱们来看一下 Spring MVC 的构造:

由图可知,Spring MVC 的具体流程如下:

  1. 首先用户发送申请————> 前端控制器(DispatcherServlet),前端控制器依据申请信息(如 URL)来决定抉择哪一个页面控制器进行解决并把申请委托给它,即以前的控制器的管制逻辑局部;
  2. 页面控制器接收到申请后,进行性能解决,首先须要收集和绑定申请参数到一个对象,并进行验证。而后将命令对象委托给业务对象进行解决;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名);
  3. 前端控制器发出控制权,而后依据返回的逻辑视图名,抉择相应的视图进行渲染(ViewResolver),并把模型数据传入以便视图渲染。
  4. 前端控制器再次发出控制权,将响应返回给用户;

大家能够把这设想成本人去医院看病的流程,前端控制器(DispatcherServlet)在这里就相当于一个医院前台的作用,咱们看病时首先须要先到前台挂号,而后依据病情被调配到不同的科室,看完病之后还要再到前台去付钱拿药。

Spring 和 Spring MVC 容器之间的关系

咱们了解了 Spring 和 Spring MVC,这里咱们讨论一下 Spring 容器和 Spring MVC 容器之间的关系?
首先要阐明的是:一个我的项目中,容器不肯定只有一个。

Spring 容器用于治理 Spring 中的 Bean,而 Spring MVC 容器用于治理 Spring MVC 中的 Bean。Spring 是父容器,Spring MVC 是其子容器。并且在 Spring MVC 子容器中注册的 Bean 能够援用 Spring 父容器中注册的 Bean,但在 Spring 容器中注册的 Bean 却不能引用 Spring MVC 容器中注册的 Bean。

这句话听起来有点绕,咱们能够看一下上面这张图,大家能够吧 spring 容器中的 bean 了解为全局变量,吧 spring MVC 容器中的 bean 了解为局部变量。在办法体中能够拜访局部变量和全局变量,然而在办法外,就只能拜访全局变量,是不能拜访局部变量的。

这里咱们要辨别一下哪些 bean 是须要被 SpringMVC 治理的,最次要就是控制器(Controller),因为它须要与前端控制器交互。其余的能够都交给 spring 的容器治理。

退出移动版