框架的一些常见问题
- 1,SpringMVC
- 1,工作流程(客户端发送一个请求,到服务器响应信息回到客户端)
- DispatcherServlet,会随着容器的启动而启动
- DispatcherServlet,会随着容器的启动而启动
- 2,SpringMVC+Spring这种开发模式的时候,会有两个容器
- 两个容器,SpringMVC容器,Spring容器
- SpringMVC容器管理,controller,Handlermapping,ViewResolver
- Spring容器管理,service,datasource,mapper,dao
- Spring容器是父容器,SpringMVC容器是子容器
- 子容器可以访问父容器上面的资源,所以我们会在看Controller可以注入Service
- 3,SpringMVC提供的Controller是单例的还是多例的?
- 单例的,来很多请求,容器里面只要一个controller实例
- 注意:多例是来一个请求,就给你创建一个controller实例
- struts2,就是多例的模式,action
- 单例的,来很多请求,容器里面只要一个controller实例
- 4,SpringMVC有哪些常用的注解?有什么作用?
- @RequestMapping:做请求的URL跟我们controller或者方法的映射关系
- @RequestParam:做请求参数的匹配,当请求参数名称跟我们方法的参数名不一致的时候,可以做匹配
- @GetMapping: 请求方式为GET
- @PostMapping:请求方式为POST
- @PathVariable:获取URL中携带的参数值,处理RESTful风格的路径参数
- @CookieValue:获取浏览器传递cookie值
- @RequestBody:接收请求中的参数信息,一般来说,接收一个集合或数组,或者以post方式提交的数据
- @ResponseBody: 改变返回逻辑视图的默认行为,返回具体的数据,比如json
- @Controller:Spring定义的,作用就是标明这是一个controller类
- 5,SpringMVC提供了哪些关键组件?
- 视图解析器:负责将逻辑视图转换为物理视图
- 文件上传解析器:负责客户端上传的文件流自动注入到我们方法的参数上MultipartFile
- 静态资源的映射
- JSON的解析处理
- 6,过滤器跟拦截器的区别?
- 7,SpringMVC跟Struts2的区别?(不要管)
- 8,谈谈Struts2跟Struts1的区别?(不要管)
- 2,Spring
- 1,Spring包含了哪些模块?
- 概览图:
- IOC容器:管理bean的创建及bean之间的依赖关系
- AOP:面向切面编程,分离我们核心业务和非核心业务,将非核心业务以切面的方式织入到核心业务中
- 核心业务:添加一个商品,添加这个动作就是核心业务
- 非核心业务:事务的控制,权限的控制,日志的打印输出,执行时间的监控
- Data Access Integration:数据访问层的整合,Spring提供了它自己封装的JDBC,Spring也对流行的ORM框架进行整合
- web:Spring提供了对web层的整合和支持,可以整合传统的mvc框架,比如Struts2,它自己也提供了一个SpringMVC
- Test:Spring整合单元测试
- 概览图:
- 2,Spring两大核心
- IOC:
- 什么是IOC,Inverse Of Control,控制反转,对象之间的依赖关系由原先的程序控制,转由第三方容器来控制,比如Spring容器
- DI:依赖注入,依赖注入是一种实现IOC的方式
- IOC在项目中有哪些应用案例?
-
public class ProductController {
@Autowired
private IProductService productService;
-
- AOP:
- 面向切面编程
- AOP的原理是什么?
- 代理是一种设计模式,实现代理的方式有两种
- 静态代理
- 动态代理
- AOP实现采用的是动态代理
- JDK Proxy:基于接口的方式
- CGLIB:生成目标类的子类,要求目标类必须不能是final类型
- Spring到底用了哪种?
- 两种都用
- 面向接口编程的,那他会选择JDK
- 没有接口,他会选择CGLIB
- 代理是一种设计模式,实现代理的方式有两种
- AOP在项目中有哪些应用案例?
- 事务的控制,权限的控制,日志的打印输出,执行时间的监控
- 拦截器就是一个AOP的实现,比如订单系统的接口访问权限控制,必须要求登录之后的合法用户才能访问
- 事务的控制具体怎么配置?
- 声明式的事务控制(XML/注解)@Transactional
- 数据源
- 事务管理器(引用数据源)
- 事务的策略(隔离级别,传播特性,设置规则,比如以list和get开头的方法都是只读事务)
- 配置切面(配置切点(事务控制的范围,表达式,com.***...(..))+事务策略
- 声明式的事务控制(XML/注解)@Transactional
- ThreadLocal
- IOC:
- 3,Spring出现的设计模式?
- 代理(AOP)
- 单例(Spring容器管理Bean,scope属性,默认就是单例的singleton,当然支持多例prototype(Struts2))
- 工厂(BeanFactory)
- 观察者(监听器)
- 适配器(SpringMVC是spring的一个模块,处理器适配器HandlerAdapter:作用是:按照特定的规则(HandlerAdapter要求的规则)去执行Handler。 )
- 模板(JdbcTemplate,HibernateTemplate,RedisTemplate,RabbitTemplate,让我们可更专注做核心业务)
- 4,SpringAOP的专业术语
- 5,Spring的scope
- singleton
- prototype
- 1,Spring包含了哪些模块?
- 3,MyBatis
- 什么是ORM、ORMapping?
- 对象关系映射
- Hibernate跟MyBatis的区别?
- Hibernate 全自动,MyBatis 半自动
- MyBatis可以灵活管理SQL,方便SQL优化
- Hibernate 常应用于公司内部的业务系统,而MyBatis更多应用于互联网项目
- MyBatis中$和#的区别?
- #采用预处理的方式,可以解决SQL注入的问题
- MyBatis的一级缓存和二级缓存?
- MyBatis如何配置一对多和一对一的关系?(XML)
- 什么是ORM、ORMapping?
- 4,Hibernate
- 悲观锁(for update),乐观锁的区别
- 乐观锁的实现(version) CAS
- 缓存(一级缓存,二级缓存,查询缓存(HQL))
- Hibernate对象的三种状态(瞬时状态,持久状态,托管状态)
- get/load的区别
- getCurrentSession()/openSession()
- 事务:getCurrentSession(),Thread(ThreadLocal)
- 5,JPA
- JPA-------》SpringData-JPA----------》 Hibernate
- Spring事务的传播特性
- 1,什么是事务的传播特性?
- 我们一般都是将事务的边界设置在Service层,
- 那么当我们调用Service层的一个方法的时,它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,
- 在事务层里面调用的这些方法要么全部成功,要么全部失败。那么事务的传播特性也是从这里说起的。
- 如果你在你的Service层的这个方法中,还调用了本类的其他的Service方法,那么在调用其他的Service方法的时候,这个事务是怎么规定的呢?
- 必须保证在我方法里调用的这个方法与我本身的方法处在同一个事务中,否则无法保证事物的一致性。
- 事务的传播特性就是解决这个问题的
- 2,Spring支持的事务传播特性
- 在Spring中,针对传播特性的多种配置,我们大多数情况下只用其中的一种:PROPGATION_REQUIRED:
- 这个配置项的意思是说当我调用service层的方法的时候,开启一个事务,
- 那么在调用这个service层里面的其他的方法的时候,如果当前方法产生了事务就用当前方法产生的事务,否则就创建一个新的事务。
- 这个工作是由Spring来帮助我们完成的。
- 3,假如没有Spring,需要自己编程来实现,则需要采用ThreadLocal来实现
- service(connection dao1,dao2 session sqlsession connection)
- ThreadLocal,为每个线程提供一个副本 set get
- 4,发生什么样的异常,Spring的事务才会回滚?
- 默认情况下当发生RuntimeException的情况下,事务才会回滚,
- 所以要注意一下 如果你在程序发生错误的情况下,有自己的异常处理机制定义自己的Exception,必须从RuntimeException类继承 这样事务才会回滚
- 5,什么是嵌套事务?
- 举个例子
-
ServiceA {
void methodA() {
ServiceB.methodB();
}
}
ServiceB {
void methodB() {
}
}
-
- Spring的事务传播级别(Propagation)
- PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
- PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
- PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
- PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
- 当事务的传播特性为PROPAGATION_REQUIRED时:
- 加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务
- 比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED,
- 那么由于执行ServiceA.methodA的时候,
- ServiceA.methodA已经开启了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。
- 这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。
- 即使ServiceB.methodB的事务已经被提交,但是ServiceA.methodA在接下来出现异常,要回滚,ServiceB.methodB也要回滚
- PROPAGATION_REQUIRES_NEW:
- 比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW
- 那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,
- 等待ServiceB.methodB的事务完成以后,他才继续执行。
- 他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度。因为ServiceB.methodB是新起一个事务,那么就是存在两个不同的事务。
- 如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。
- 如果ServiceB.methodB失败回滚,如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。
- PROPAGATION_NESTED:
- 理解Nested的关键是savepoint。
- 他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,
- 而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
- 而Nested事务的好处是他有一个savepoint。详见代码
-
ServiceA {
void methodA() {
try {
//savepoint
ServiceB.methodB(); //PROPAGATION_NESTED 级别
} catch (SomeException) {
// 执行其他业务, 如 ServiceC.methodC();
}
}
}
- 举个例子
- 1,什么是事务的传播特性?
- SpringBoot如何控制事务
- 1,SpringMVC
- 1,工作流程(客户端发送一个请求,到服务器响应信息回到客户端)
- DispatcherServlet,会随着容器的启动而启动
- DispatcherServlet,会随着容器的启动而启动
- 2,SpringMVC+Spring这种开发模式的时候,会有两个容器
- 两个容器,SpringMVC容器,Spring容器
- SpringMVC容器管理,controller,Handlermapping,ViewResolver
- Spring容器管理,service,datasource,mapper,dao
- Spring容器是父容器,SpringMVC容器是子容器
- 子容器可以访问父容器上面的资源,所以我们会在看Controller可以注入Service
- 3,SpringMVC提供的Controller是单例的还是多例的?
- 单例的,来很多请求,容器里面只要一个controller实例
- 注意:多例是来一个请求,就给你创建一个controller实例
- struts2,就是多例的模式,action
- 单例的,来很多请求,容器里面只要一个controller实例
- 4,SpringMVC有哪些常用的注解?有什么作用?
- @RequestMapping:做请求的URL跟我们controller或者方法的映射关系
- @RequestParam:做请求参数的匹配,当请求参数名称跟我们方法的参数名不一致的时候,可以做匹配
- @GetMapping: 请求方式为GET
- @PostMapping:请求方式为POST
- @PathVariable:获取URL中携带的参数值,处理RESTful风格的路径参数
- @CookieValue:获取浏览器传递cookie值
- @RequestBody:接收请求中的参数信息,一般来说,接收一个集合或数组,或者以post方式提交的数据
- @ResponseBody: 改变返回逻辑视图的默认行为,返回具体的数据,比如json
- @Controller:Spring定义的,作用就是标明这是一个controller类
- 5,SpringMVC提供了哪些关键组件?
- 视图解析器:负责将逻辑视图转换为物理视图
- 文件上传解析器:负责客户端上传的文件流自动注入到我们方法的参数上MultipartFile
- 静态资源的映射
- JSON的解析处理
- 6,过滤器跟拦截器的区别?
- 7,SpringMVC跟Struts2的区别?(不要管)
- 8,谈谈Struts2跟Struts1的区别?(不要管)
- 1,工作流程(客户端发送一个请求,到服务器响应信息回到客户端)