Fork me on Gitee

Spring面试题

一、SpringAOP的原理(参考1)

AOP(面向切面)面向对象编程更多的操作是在纵向部分(即继承,接口实现之类),这就导致一些需要在横向上(即业务代码方法中的前后)嵌入的非核心代码得在每一个方法上都要去写(比如日志,权限,异常处理等--》AOP的应用)。它们散布在各方法的横切面上,造成代码重复,也不利于各个模块的重用(毕竟,不同方法还是有所区别)。 AOP就是为了解决这种难题而生的 从AOP这个英文缩写来看就好。。。A是一把刀,把P的突出部分切出来(类比于围绕方法设定的日志,权限等需求,它们都是属于核心方法外的通用服务),它们有一个共性----圆溜溜的(就像一个工具箱中的扳手,钳子,螺丝刀之类的),所以能把它们集合成一块儿(它们都具有’工具‘的属性),就是中间的O。重新给接回去的时候,就着不同的需求,用O中不同的工具就好(通过不同的方法或注解指明)。

概念陈列: 目标对象,AOP代理对象,连接点,切入点,拦截器,通知,织入。

假设有一个对象A(目标对象),外部的请求人B要想访问到A,需要通过一个安检过程(连接点,比如验证权限m1,登录密码m2,身份识别m3等)。B开始访问后,首先得经过第一层的安检(准备走谁(introductionInterceptor)的哪一层安检(PointCut--》指定到具体的安检流程),由你定义的interceptor拦截器决定),即权限验证m1(切入点)。通过这一层后,监控整个访问过程的你可以决定是否要向大家伙儿通报外部请求的访问情况【像:B那孙子进来啦 OR B那孙子带着贪玩蓝月系来嘞 OR B那小子是渣渣辉的部下】(在访问开始前,还是结束后,还是全程播报---->这就是’通知‘)。于A而言,他觉得直接跟B接触可能不太安全,所以A把自己的一些权限给到了代理对象Proxy_A,并让Proxy_A去正面’刚(也即织入,A间接的给自己加持了一副铠甲)‘B(或许是来者不善乜)。Proxy_A是怎样产生的呢?这就是AOP动态代理的辅助了。简单来讲,不论你是什么代理---》Proxy_某个目标对象,只要是通过JDK或者CGLib的代理副本传送门(类比于抽象)进入到刚B的’对战场景‘中,那么,他都算是A(或者其他目标对象)的代言人。

项目springAOP的应用

  1. 日志 (最下面有日志注解)
  2. 权限
  3. spring注解事务,框架自带的

二、Spring事务

  • 什么是事务?(参考2)

事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。

(例:一个Service方法中调用了多个dao方法,要么一起成功,要么一起失败!)

  • 事务的特性(ACID)

原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。

一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。

隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。

持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

  • Spring进行事务操作的方式

  • 编程式事务管理

  • 声明式事务管理

    • 基于xml配置文件方式
    • 基于注解方式(@Transactional)
  • spring事务失效场景(参考3)(参考4)

  1. (异常类型乱配置)异常类型错误,默认是runtimeException才回滚(异常抛出类型不对)
  2. (异常被狗吃了)异常被catch住,忘记抛出,记住必须抛异常才回滚(异常被吃)
  3. (配置手残党)spring忘记配置扫描包,bean不在spring容器管理下
  4. (经典失效场景)是否发生自调用问题(自身调用)
  5. 注解所在方法是否为public修饰
  6. (配置手残党)数据源没有配置事务管理器
  7. 不支持事务的DB,如MyISAM
posted @ 2020-03-23 15:53  明叶师兄。  阅读(990)  评论(0编辑  收藏  举报