Spring框架

Posted vansenjoy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架相关的知识,希望对你有一定的参考价值。

在上个项目中我们用到了SSH。在这里对SSH做一个简单的整理,方便自己以后能更熟悉的运用SSH

SSH:就是Spring + SpringMVC + Hibernate 

Spring 是一个开源的JavaEE开发框架,Spring框架的核心功能可以应用到Java应用程序中。Spring框架的目标是让JavaEE开发更加简捷,通过使用POJO为基础的编程模型促进良好的编程风格

Spring的优点

轻量级:Spring 在大小和透明性方面绝对是属于轻量级的

控制反转(IOC):Spring使用IOC技术实现了松耦合。通过DI依赖注入到对象。

IOC:控制反转,这东西不是技术,而是一种编程思想,一个重要的面向对象编程的法则(百度的)。我在使用的时候也不太理解这个东西,只知道它是Spring的核心。后来通过查询github上面的资料以及它的原代码。才知道IOC的功能。

IOC的作用:简单来说,IOC对于Spring框架来说,就是由Spring来控制对象的生命周期和对象间的关系,同时SpringIOC也是一个容器。为整个系统所组成的组件提供一个运行环境。另一个作用就是产生实例(通过反射)。最大的好处就是降低了代码之间的耦合。

DI依赖注入:IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其它对象。这一点是通过DI来实现的。

小结:我个人对IOC的看法是以前创建对象的控制权进行转移,以前创建对象的主动权以及创建对象的时机都是由我们自己控制的,而现在这种权力交给了第三方,也就是IOC。

AOP(面向切面编程):AOP核心 :切面,动态代理的一个代表。能让我们把一些非核心代码(也就是与业务无关的代码)可以提出来,这么做的好处可以隐藏真实对象,可以剥离一些很繁琐,重复性高的逻辑。解耦合,提高复用性。比如说:日志,事务。AOP的亮点就是需求的分类。

================================================================================================================================

SpringMVC:

Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。

这里就简单说下核心架构的流程,因为还有些地方我都还没有搞明白。

比如:

1、  请求如何给前端控制器?

2、  前端控制器如何根据请求信息选择页面控制器进行功能处理?

3、  如何支持多种页面控制器呢?

4、  如何页面控制器如何使用业务对象?

5、  页面控制器如何返回模型数据?

6、  前端控制器如何根据页面控制器返回的逻辑视图名选择具体的视图进行渲染?

7、  不同的视图技术如何使用相应的模型数据?

核心架构的具体流程步骤如下:

1、  首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;

2、  DispatcherServlet——>HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;

3、  DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;

4、  HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);

5、  ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;

6、  View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;

7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

 

==============================================================================================================================

Hibernate :是一个开源的对象关系映射(ORM)持久层框架,用于管理Java实体类到数据库表之间的映射关系,数据库Columns与实体类的属性之间的关系。

Hibernate特点:与数据库无关性很好,它不关心我们到底使用的是什么数据库。当我们更换数据库时,不用更改我们原来的代码,只需要去配置文件中去更改我们配置好的"方言"。还有就是Hibernate关注的是开发效率。

Hibernate的几个关键对象:

SessionFactory:hibernate关键对象,它是单个数据库映射关系经过编译后的内存镜像,线程安全。主要作用是生成Session的工厂,该对象可以为事务之间可重用的数据提供可选的级缓存。

Session:它是应用程序与持久储存层之间交互操作的一个单线程对象,是hibernate持久化操作的关键对象,所有的持久化对象必须在Session管理下才可以进行持久化操作。此对象的生命周期极短,底层封装了JDBC连接。Session对象持有一个必选的一级缓存,显式执行flush()之前,所有持久化操作的数据都缓存在Session对象处。

事务(transaction)具有数据库事务的概念,Hibernate事务是对底层具体的JDBC、JTA、以及CORBA事务的抽象,在某些情况下,一个Session之内可能包含多个Transaction对象。虽然事务操作是可选的,但所有持久化操作都应该在事务管理下进行,即便是只读操作。

事务工厂(TransactionFactory)是生成Transaction对象实例的工厂,该对象无须应用程序直接访问,它负责对底层具体的事务实现进行封装、将底层具体的事务抽象成Hibernate事务。

Hibernate中Java对象的三种形态:

new出来的(瞬态对象(暂态对象))
持久化对象发生变化会自动去数据库刷新,Session引用的对象叫持久化状态对象
游离状态对象(Session关闭时)
如果通过Session再引用该对象时,变成持久化状态对象。通过Session引用以后再通过数据库把该对象删除以后,该对象就变成了瞬态对象

Hibernate中get()方法和load()方法的区别:

get()方法:在查询时,它的查询顺序是先查询一级缓存,如果二级缓存开启的情况下,再查询二级缓存,最后再查询数据库,(get()方法,一定会拿到数据,如果没有拿到数据将返回NUll对象)。支持关联对象的延迟加载,但是不支持直接对象的延迟加载。
load()方法:在查询时,它的查询顺序是先查询一级缓存,如果二级缓存开启的情况下,再查询二级缓存,如果查询到数据就返回数据,如果二级缓存没有查询到数据,将不再查询数据库,而是默认数据中一定存在这条数据,并返回一个动态代理对象。(load并不知道数据库里到底有没有要查询的数据,它是想当然的认为数据库一定是存在要查询的数据的)
只有当程序真实调用该动态代理对象时,才会去查询数据库。所以load是懒加载模式。如果数据库存在数据,正常返回,如果数据不存在,将返回一个异常:ObjectNotFoundException
load()方法,不允许关闭session,如果session关闭了,会抛出异常:no Session。

Hibernate中的锁机制:

出现原因:为了保证数据的准确性。

悲观锁
一定会有人同时来操作同一条数据
原理:在操作某一条数据时,只想自己能够操作该数据。那么直接给该数据加锁,只有自己能访问该数据。
在锁定时尽量把锁的数据范围最小。
乐观锁
一定不会有人同时来操作同一条数据
实现:采用版本控制来逻辑加锁
hibernate配置文件中给class加上一个属性:optimistic-lock="version"
预编译HQL语句时跟上.setCacheable(true)
就表示给该条记录加上了乐观锁

 
















以上是关于Spring框架的主要内容,如果未能解决你的问题,请参考以下文章

自己写的框架怎么融入到spring

spring框架优点

Spring框架学习教程,spring框架最全面的原理解析

Spring框架入门

spring框架有啥用?

Spring框架--Spring事务管理和Spring事务传播行为