spring的概念:是一种容器可以管理所有的组件(也就是具有功能的类)框架。
核心关注:IOC和AOP
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sYyFYBMu-1593404592479)(E:\笔记整理\Typora\java面试\面试准备图片\spring(IOC和AOP).png)]
IOC 控制反转
容器:主动的new资源变为被动的接受资源;主动获取变为被动接受;
DI:(Dependency Injection)依赖注入; 容器能知道哪个组件(类)运行的时候,需要另外一个类(组件);容器通过反射的形式,将容器中准备好的BookService对象注入(利用反射给属性赋值)到BookServlet中;
AOP:(Aspect Oriented Programming)面向切面编程;
指在程序运行期间,将某段代码动态的切入到指定方法的指定位置进行运行的这种编程方式,面向切面编程;
MyBatis;和数据库进行交互;持久化层框架(SQL映射框架)
动态SQL:MyBatis 的强大特性之一便是它的动态 SQL,它极大的简化了我们拼接SQL的操作。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。
MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素:
if
choose (when, otherwise)
trim (where, set)
foreach
缓存:
一级缓存:
它指的是Mybatis中SqlSession对象的缓存。
当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中。
该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中
查询是否有,有的话直接拿出来用。
当SqlSession对象消失时,mybatis的一级缓存也就消失了。
二级缓存: 基于配置文件的开发
它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
1、javaEE项目启动过程:首先加载Spring上下文环境配置文件,然后加载SpringMVC配置文件。
Spring配置加载过程:
tomcat服务器启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,然后会读取它的listener和context-param节点,然后紧接着会创建一个ServletContext(servlet上下文,全局的),这个web项目的所有部分都将共享这个上下文,容器将转换为键值对,并交给servletContext,可以获取当前该web应用对象,即servletContext对象,获取context-param值,进而获取资源,在web应用启动前操作) ,listener中ContextLoaderListener监听器的作用就是启动Web容器时,监听servletContext对象的变化,获取servletContext对象的,来自动装配ApplicationContext的配置信息。这样spring的加载过程就完成了。
SpringMVC配置加载过程:
springMVC其实和spring是一样的,但是它不用在程序开始时访问。springMVC的加载过程是通过Servlet节点 。
Servlet介绍:
Servlet通常称为服务端小程序,是服务端的程序,用于处理及响应客户的请求。Servlet是一个特殊的Java类,创建Servlet类自动继承HttpServlet。客户端通常只有GET和POST两种请求方式,Servlet为了响应这两种请求,必须重写doGet()和doPost()方法。大部分时候,Servlet对于所有的请求响应都是完全一样的,此时只需要重写service()方法即可响应客户端的所有请求。
创建Servlet实例有两个时机:
客户端第一次请求某个Servlet时,系统创建该Servlet的实例,大部分Servlet都是这种Servlet;
web应用启动时立即创建Servlet实例,即1
2、监听器如何进行项目的初始化
监听器中通过contextInitialized(ServletContextEvent args)初始化方法,来获得ServletContext 对象以及context-param值。
ServletContext = ServletContextEvent.getServletContext();
context-param的值 = ServletContext.getInitParameter("context-param的键");
拿到这个context-param的值之后,可以在WEB项目还没有完全启动时,进行一些初始化工作,但是最主要的还是自动装配ApplicationContext的配置信息。
3、spring和springMVC整合后,可以取消掉web.xml中spring的listener配置吗?
如果只有 Spring mvc 的一个 Servlet,listener 可以不用。
但是如果用了Shiro 等,Shiro 用到的 Spring 的配置必须在 listener 里加载。
一般 Dao, Service 的 Spring 配置都会在 listener 里加载,因为可能会在多个 Servlet 里用到,因为父子 Context 的可见性问题,防止重复加载所以在 listener 里加载。
4、web.xml中spring的核心ContextLoaderListener初始化的上下文和springmvc的核心DispatcherServlet初始化的上下文关系
ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的 :一般如DAO层、Service层Bean;
DispatcherServlet初始化的上下文加载的Bean是只对Spring Web MVC有效的Bean,如Controller,该初始化上下文应该只加载Web相关组件。
mysql
-
事务的基本介绍
- 概念:
- 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
- 操作:
- 开启事务: start transaction;
- 回滚:rollback;
- 提交:commit;
- 概念:
-
事务的四大特征:
1. 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
2. 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
3. 隔离性:多个事务之间。相互独立。
4. 一致性:事务操作前后,数据总量不变 -
事务的隔离级别(了解)
- 概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
- 存在问题:
-
脏读:一个事务,读取到另一个事务中没有提交的数据
2. 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样。
3. 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
* 隔离级别:
1. read uncommitted:读未提交* 产生的问题:脏读、不可重复读、幻读 2. read committed:读已提交 (Oracle) * 产生的问题:不可重复读、幻读 3. repeatable read:可重复读 (MySQL默认) * 产生的问题:幻读 v 4. serializable:串行化 * 可以解决所有的问题 5. * 注意:隔离级别从小到大安全性越来越高,但是效率越来越低 * 数据库查询隔离级别: * select @@tx_isolation; * 数据库设置隔离级别: * set global transaction isolation level 级别字符串;
-
- 存在问题:
- 概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。