关于SSM的总结

spring的IOC

什么是ioc:spring IOC可以帮助我们创建对象、管理对象、销毁对象。在我们传统的开发过程中,我们需要一个对象的时候可能是直接new出来,但是这样对象与对象之间的依赖关系十分复杂,有了spring之后,它可以帮助我们自动管理对象与对象之间的依赖,当我们需要的时候,直接从容器中获取,从而简化我们的开发。

详细的依赖和配置可以参考 曲健磊 Spring常用的三种注入方式  https://blog.csdn.net/a909301740/article/details/78379720

里面很详细的给出了注入方法的例子以及spring的@Component, @Controller, @Repository, @Service@Autowired和@Resource的讲解

spring的依赖注入

  • 接口注入:不推荐
  • 构造器注入:
  • Setter方法注入:

spring beans

配置方式:

  • XML配置文件
  • 基于注解的配置
  • 基于java的配置

作用域:

singleton:单例,默认

prototype:多例

request:每次HTTP请求都i会创建一个bean

session:

global-session

 

多线程下的并发安全问题?

因为springbean不是线程安全的,所以一般使用ThreadLocal解决线程安全问题

ThreadLocal会为每个线程提供一个独立的变量副本,从而隔离多个线程对访问数据的冲突。每个线程能拿到的只是自己范围内的数据。

springBean的生命周期:

img

spring框架的自动装配

  • no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。

  • byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。

  • byType:通过参数的数据类型进行自动装配。

  • constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。

  • autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。

 

springAOP

一般也叫做面向切面编程,是将一些与业务无关,但是却需要的重复代码抽取出来,称为可重复使用的模块,一般用于日志、权限校验、事务处理等。

在springAOP中一般有JDK动态代理和CGLIB动态代理。

JDK动态代理必须要实现接口,他会给你实现同一个接口的类,而CGLIB会生成代理类的子类。

spring的事务

spring事务的传播行为:

  • ① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

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

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

  • ④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。

  • ⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

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

  • ⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。

springMVC的执行流程

  • (1)用户发送请求至前端控制器DispatcherServlet;

  • (2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;

  • (3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;

  • (4)DispatcherServlet 调用 HandlerAdapter处理器适配器;

  • (5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);

  • (6)Handler执行完成返回ModelAndView;

  • (7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;

  • (8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;

  • (9)ViewResolver解析后返回具体View;

  • (10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)

  • (11)DispatcherServlet响应用户。

mybatis中#{}和${}的区别

#{} 可以有效的防止SQL注入,提高系统安全性;${} 不能防止SQL 注入

Mybatis的一级、二级缓存

Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

 1、一级缓存的生命周期有多长?

  a、MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。

  b、如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。

  c、如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。

  d、SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用

    2、怎么判断某两次查询是完全相同的查询?

  mybatis认为,对于两次查询,如果以下条件都完全一样,那么就认为它们是完全相同的两次查询。

  2.1 传入的statementId

  2.2 查询时要求的结果集中的结果范围

  2.3. 这次查询所产生的最终要传递给JDBC java.sql.Preparedstatement的Sql语句字符串(boundSql.getSql() )

  2.4 传递给java.sql.Statement要设置的参数值

一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。

用户发起查询请求,查找某条数据,sqlSession先去缓存中查找,是否有该数据,如果有,读取;

如果没有,从数据库中查询,并将查询到的数据放入一级缓存区域,供下次查找使用。

但sqlSession执行commit,即增删改操作时会清空缓存。这么做的目的是避免脏读。

如果commit不清空缓存,会有以下场景:A查询了某商品库存为10件,并将10件库存的数据存入缓存中,之后被客户买走了10件,数据被delete了,但是下次查询这件商品时,并不从数据库中查询,而是从缓存中查询,就会出现错误。

既然有了一级缓存,那么为什么要提供二级缓存呢?

二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。二级缓存的作用范围更大。

还有一个原因,实际开发中,MyBatis通常和Spring进行整合开发。Spring将事务放到Service中管理,对于每一个service中的sqlsession是不同的,这是通过mybatis-spring中的org.mybatis.spring.mapper.MapperScannerConfigurer创建sqlsession自动注入到service中的。 每次查询之后都要进行关闭sqlSession,关闭之后数据被清空。所以spring整合之后,如果没有事务,一级缓存是没有意义的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值