常用框架02 - Spring

三层架构和 MVC

1. 三层架构

      我们的开发架构一般都是基于两种形式的:C/S 架构(客户端 / 服务器)和 B/S架构(浏览器 / 服务器)。在Java EE开发中,几乎都是基于B / S 架构开发的。在B / S 中,系统标准的三层架构包括:表现层、业务层、持久层

    01 表现层也就是web层,它负责接收客户端请求,向客户端响应结果。通常客户端使用http协议请求web层,web层需要接收http请求,完成http响应。

         表现层包括展示层和控制层,控制层负责接收请求,展示层负责结果的展示。表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端。表现层的设计一般都使用 MVC 模型。(MVC 是表现层的设计模型,和其他层没有关系)

   02 业务层也就是service层,它负责业务逻辑处理,和我们开发项目的需求息息相关。web 层依赖业务层,但是业务层不依赖 web 层。业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的,事务应该放到业务层来控制)。

   03 持久层也就是dao层,它负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。通俗的讲,持久层就是和数据库交互,对数据库表进行增删改查的。

 2. MVC模型

        MVC(Model View Controller),是模型model -- 视图view -- 控制器controller的缩写,是一种用于设计Web应用程序表现层的模式。MVC中每个部分各司其职,

        01 model:数据模型,JavaBean的类,用来进行数据封装。

        02 view:指JSP、HTML用来展示数据给用户。

        03 controller:用来接收用户请求,整个流程的控制器。用来进行数据校验等。

1. 对Spring MVC的了解

         MVC 是一种设计模式,Spring MVC是一款优秀的 MVC 框架。

        Spring MVC 又称为Spring Web MVC,是一种基于 Java 实现的 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 Spring Framework 的后续产品。它可以帮助我们进行更简洁的Web层的开发,并且它天生与 Spring 框架集成。Spring MVC下我们一般把后端项目分为Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller层(控制层,返回数据给前台页面)。

 2. Spring MVC 的工作原理

        原理如下图所示,

 上图中有个小错误,Spring MVC 的入口函数,也就是前端控制器DispatcherServlet的作用是接收请求,响应结果

流程说明:

      01 客户端(浏览器)发送请求,直接请求到前端控制器DispatcherServlet。

      02 前端控制器根据请求信息调用处理器映射器HandlerMapping,解析请求对应的处理器Handler。

      03 解析到对应的Handler(也就是平常说的Controller控制器)后,开始由HandlerAdapter适配器处理。

      04 适配器会根据Handler来调用真正的处理器来处理请求,并处理相应的业务逻辑。

      05 处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View。

      06 ViewResolver 会根据逻辑View 查找实际的 View。

      07 DIspaterServlet 把返回的Model传给View(视图渲染)。

      08 把View 返回给请求者(浏览器)。

3. Spring 框架用到了哪些设计模式?

(1)工厂模式

        Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。其中,BeanFactory 使用到某个Bean时才会进行注入,而ApplicationContext 在容器启动时就会创建所有的Bean,因此BeanFactory 占用的内存更少,程序启动速度更快。

(2)代理设计模式 

        Spring AOP 功能的实现。

        Spring AOP基于动态代理实现的: 代理对象实现了接口: Spring AOP会使用Java动态代理JDK Proxy创建代理对象,完成对象的代理操作。代理对象没有实现接口: Spring AOP会使用Cglib Proxy生成一个被代理对象的子类作为代理类完成对象的代理操作。

(3)单例设计模式 

        Spring 中的 Bean 的作用域默认都是单例的。

(4)包装器设计模式

        我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。

(5)观察者模式

        Spring 事件驱动模型就是观察者模式很经典的一个应用。

(6)适配器模式

        Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配 Controller。

        等等。

4. Spring 管理事务分为几种?  事务管理

(1)编程式事务,在代码中硬编码。(不推荐使用)  BeanFactory使用。编程式事务管理我们可以通过PlatformTransactionManager实现来进行事务管理,同样的Spring也为我们提供了模板类TransactionTemplate进行事务管理。

(2)声明式事务,在配置文件中配置(推荐使用) ApplicationContext使用。声明式事务管理有两种常用的方式,一种是基于tx和aop命名空间的xml配置文件,一种是基于@Transactional注解,随着Spring和Java的版本越来越高,大家越趋向于使用注解的方式。

        声明式事务又分为两种:基于 XML 的声明式事务 与 基于注解的声明式事务。

       Spring 事务的本质就是数据库对事务的支持,Spring事务管理的核心接口是Platform TransactionManager,

5. Spring 事务中的隔离级别有哪几种?

        五种。

(1)DEFAULT

        使用数据库本身使用的隔离级别,Oracle采用的是读取已提交,MySQL采用的是可重复读。

(2)READ_UNCOMITTED

        最低的隔离级别。读取未提交,可能导致脏读、幻读、不可重复读。

(3)READ_COMMITED

        读取已提交,Oracle默认的隔离级别,能够避免脏读,可能导致幻读或不可重复读。

(4)REPEATABLE_READ

        可重复读,能够避免脏读、不可重复读,可能会导致幻读。

(5)SERLALIZABLE

        串行化,最高的隔离级别。所有事务依次逐个执行,可以避免脏读、幻读、不可重读的。但这将严重影响程序的性能,通常情况下不会使用到该级别。

6. Spring 事务中哪几种事务传播行为?

       事务传播行为就是指当一个事务方法被另一个事务方法调用时,这个事务方法该如何传递。例如:methodA方法调用methodB方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这是由methodB的事务传播行为决定的。事务传播行为有以下7种

(1)PROPAGATION_REQUIRED

        如果当前没有事务,就创建一个新事务;如果当前存在事务,就加入该事务。这是最常见的选择,也是Spring默认的事务传播行为。

(2)PROPAGATION_SUPPORTS

        支持当前事务,如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。

(3)PROPAGATION_MANDATORY

        支持当前事务,如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。

(4)PROPAGATION_REQUIRES_NEW

        创建新事务,无论当前存不存在事务,都创建新事务。

(5)PROPAGATION_NOT_SUPPORTED

        以非事务方式运行,如果当前存在事务,就把当前事务挂起。

(6)PROPAGATION_NEVER

        以非事务方式执行,如果当前存在事务,则抛出异常。

(7)PROPAGATION_NESTED

        如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行。如果当前没有事务,则按REQUIRED属性执行。

7. @Transactional(rollbackFor = Exception.class)注解了解吗?

        Exception 分为运行时异常RuntimeException 和非运行时异常。事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。

        当 @Transactional 注解作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。如果类或者方法加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。

        在 @Transactional 注解中如果不配置 rollbackFor 属性,那么事务只会在遇到运行期异常的时候才会回滚。加上 rollbackFor=Exception.class ,可以让事物在遇到非运行时异常时也回滚。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值