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给咱们提供的模块相当的丰盛,无论是长久层、业务层还是管制层都有所波及。
- Spring简直包揽除了业务逻辑之外的的所有工作,包含日志治理、事务管理、Bean治理、平安治理等。
- Spring致力于全套的Java问题的解决方案,在所有的Java能够涉足的畛域,Spring都会提供相应的反对。(即便没有反对,也会让咱们去整合)
- 与第三方框架的整合。在我的了解中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是一种十分罕用的解决方案。
面向切面编程对咱们来说有什么益处?
- 缩小反复;
- 专一业务;
留神:面向切面编程只是面向对象编程的一种补充。
长处
- Bean的对立治理,升高了对象之间的耦合
- 对支流的框架提供了很好的集成反对
- 提供泛滥组件,事务管理,JDBC等
- 具备高度可开放性,开发者能够自由选择Spring局部或全副
- 次要应用工厂模式和代理模式。
- 低侵入,代码净化极低。(咱们不会因为用了spring而影响咱们的失常的业务逻辑)
- 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的具体流程如下:
- 首先用户发送申请————>前端控制器(DispatcherServlet),前端控制器依据申请信息(如URL)来决定抉择哪一个页面控制器进行解决并把申请委托给它,即以前的控制器的管制逻辑局部;
- 页面控制器接收到申请后,进行性能解决,首先须要收集和绑定申请参数到一个对象,并进行验证。而后将命令对象委托给业务对象进行解决;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名);
- 前端控制器发出控制权,而后依据返回的逻辑视图名,抉择相应的视图进行渲染(ViewResolver),并把模型数据传入以便视图渲染。
- 前端控制器再次发出控制权,将响应返回给用户;
大家能够把这设想成本人去医院看病的流程,前端控制器(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的容器治理。
发表回复