SpringBoot相关面试题
Spring AOP
1.什么是AOP?
AOP (Aspect Orient Programming),直译过来就是 ⾯向切⾯编程。能够将与业务无关,但是多个业务模块都需要用到的一样逻辑进行封装,在原来的业务模块功能上,进行无侵入的功能增强。这样做不仅减少了代码的冗余,还实现了解耦,提高了开发效率。AOP要达到的效果就是,在保证开发者不修改源代码的情况下,为系统中业务组件添加某种通用的功能。
举个例子:
日志功能:
在客户端发起请求的时候,都需要记录发起请求的内容。比如:请求IP,请求参数,方法描述,如果出现异常了,可能还需要记录异常代码,异常信息,出现异常的方法。如果在每个controller和每个service层都 写一边这个逻辑的话,会十分的重复,且controller和service层实现的主要是项目业务的逻辑,而不是日志逻辑,把日志的逻辑功能写进controller和service层就显得十分的不优雅。
2.有关AOP的几个概念
1.连接点:JoinPoint
连接点,也就是被AOP所拦截控制的方法,可理解为上图中 绿线和蓝块 相交的 某个点
实际上连接点还可以是字段或者构造器,但是Spring中只支持方法类型的连接点
2.切入点:PointCut
对 连接点的定义。即,匹配连接点的条件。
用上面的图解释就是,绿色的线(切面)要以什么样的角度(切入点)来切割(拦截)蓝色的块(业务方法)
只要符合切点表达式的方法,都是连接点,所以说切入点就是连接点的定义
3.通知:advice
AOP拦截拦截点后,要执行的逻辑
通知又分为:
前置通知:在连接点执行前执行,@Befor
比如:要对连接点进行安全验证,只有相关权限或者身份的用户才能访问该连接点时,就需要用到前置通知@Befor
又比如:在目标方法被执行前,先检查缓存是否存在所需要的数据,如果需要就直接返回,不需要查询数据库了。
环绕通知:在连接点执行前后都执行,@Around
比如:需要计算连接点 执行的时间,就需要@Around
后置通知:在连接点执行完毕后才执行,@After
异常通知:在链接点发送异常后才执行,@AfterThrowing
最终通知:在连接点执行完毕后且没有异常 才执行,@AfterReturning
切面:Aspect
切点和通知,就是切面。 也就是绿线和蓝快相交的那个面。
目标对象:target
AOP所代理的目标对象
Spring AOP的底层是基于动态代理技术实现的,在程序运行的时候,会基于动态代理技术把目标对象拦截下来,进行功能的增强,然后生成一个增强功能后的代理对象。
我们使用@Autowired 注入目标对象的时候,实际上注入的不是原来的对象了,而是被功能增强后的代理对象了。
这些事 都是基于动态代理 在底层帮我们实现了
织入:weave
将切面应用到目标对象,并创建代理对象的过程
3. AOP的应用
日志记录:自定义日志记录注解,利用 AOP,一行代码即可实现日志记录。
性能统计:利用 AOP 在目标方法的执行前后统计方法的执行时间,方便优化和分析。
事务管理:
@Transactional
注解可以让 Spring 为我们进行事务管理比如回滚异常操作,免去了重复的事务管理逻辑。@Transactional
注解就是基于 AOP 实现的。权限控制:利用 AOP 在目标方法执行前判断用户是否具备所需要的权限,如果具备,就执行目标方法,否则就不执行。例如,SpringSecurity 利用
@PreAuthorize
注解一行代码即可自定义权限校验。接口限流:利用 AOP 在目标方法执行前通过具体的限流算法和实现对请求进行限流处理。
缓存管理:利用 AOP 在目标方法执行前后进行缓存的读取和更新。如:SpringCache部分源码解读
……
Spring IoC
1.什么是IoC
IoC:控制反转。控制反转,是一种设计思想,而不是某一个具体的技术。
IoC的基本思想就是把 原本需要在程序中手动创建的对象的控制权交给Spring来管理
控制反转不是Spring特有的,在其他框架或者语言中也有实现(如:在javascript领域React、Vue.js它们也采用了控制反转的思想,通过依赖注入和组件化开发来管理和组织代码。)
控制:对象创建(实例化,管理)的权利
反转:本来这个权利,是由开发者的权利,在开发过程中对对象创建,实例化,管理,但是这个权利交给了外部环境(如Spring)来管理,所以就曾为“反转”。