spring常见的面试题

1.谈谈你所理解AOP?

AOP的具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取信息的方式,对该信息进行装饰,以取代鱼油对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。


2.AOP中的一些术语

通知、增强处理(Advice 就是你想要的功能,也就是上说的安全、事物、日子等。你给先定义好,然后再想用的地方用一下。包含Aspect的一段处理代码

连接点(JoinPoint 这个就更好解释了,就是spring允许你是通知(Advice)的地方,那可就真多了,基本每个方法的钱、后(两者都有也行),或抛出异常是时都可以是连接点,spring只支持方法连接点。其他如AspectJ还可以让你在构造器或属性注入时都行,不过那不是咱们关注的,只要记住,和方法有关的前前后后都是连接点。

切入点(Pointcut 上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有十几个连接点了对吧,但是你并不想在所有方法附件都使用通知(使用叫织入,下面再说),你只是想让其中几个,在调用这几个方法之前、之后或者抛出异常时干点什么,那么就用切入点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。

切面(Aspect 切面是通知和切入点的结合。现在发现了吧,没连接点什么事,链接点就是为了让你好理解切点搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的beforafteraround等就能知道),二切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。

引入(introduction 允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗

目标(target 引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咋们织入切面。二自己专注于业务本身的逻辑。

代理(proxy 怎么实现整套AOP机制的,都是通过代理,这个一会儿给细说。

织入(weaving 把切面应用到目标对象来创建新的代理对象的过程。目标对象 – 项目原始的Java组件。

AOP代理  – AOP框架生成java对象。

AOP代理方法 = advice + 目标对象的方法。


3.Aop实现原理?

通过静态或着动态代理,在不改变原代码的情况下,增强方法


4.aop开发流程?

第一步:导入相应jar.

第二步:编写被代理对象

第三步:写一个类继承相关Advice的接口

第四步:生成代理:(配置生成代理:)

第五步:编写测试类

5.后置通知和返回通知区别?

无论连接点正常返回还是抛出异常,后置通知都会执行。如果只想在连接点返回的时候记录日志,应使用返回通知代替后置通知。

在返回通知中,只需要在@AfterReturning注解中添加returning属性,就可以访问连接点的返回值。

必须在通知方法的签名中添加一个同名参数,在运行时Spring AOP会通过这个参数传递给返回值。

 

6.后置通知怎么获取目标方法返回值,及通知的信息?

访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点。JoinPoint里包含了如下几个常用的方法Object[]getArgs:返回目标方法的参数SignaturegetSignature:返回目标方法的签名ObjectgetTarget:返回被织入增强处理的目标对象ObjectgetThis:返回AOP框架为目标对象生成的代理对象注意:当使用@Around处理时,我们需要将第一个参数定义为ProceedingJoinPoint类型,该类是JoinPoint的子类。


7.异常通知怎么获取目标方法的异常信息?

只在连接点抛出异常时才执行异常通知

 throwing 属性添加到 @AfterThrowing 注解中, 也可以访问连接点抛出的异常. Throwable 是所有错误和异常类的超类. 所以在异常通知方法可以捕获到任何错误和异常.

如果只对某种特殊的异常类型感兴趣, 可以将参数声明为其他异常的参数类型. 然后通知就只在抛出这个类型及其子类的异常时才被执行.

 

8.环绕通知的参数可以做哪些事情?

环绕通知在一个方法执行之前和之后执行。它使得通知有机会既在一个方法执行之前又在执行之后运行。并且,它可以决定这个方法在什么时候执行,如何执行,甚至是否执行。环绕通知经常在在某线程安全的环境下,需要在一个方法执行之前和之后共享某种状态的时候使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值