Spring面试题, 能说说 Spring 拦截链的实现吗?
Spring面试题, 能说说 Spring 拦截链的实现吗?
QA
Step 1
Q:: Spring拦截链的实现
A:: Spring拦截链的实现是通过Spring AOP(Aspect-
Oriented Programming)来实现的。Spring AOP允许你定义横切关注点(如日志记录、安全检查、事务管理等),这些横切关注点通过切面(Aspect)定义。一个切面包含多个通知(Advice),这些通知可以在方法执行前(Before)、后(After)、抛出异常时(AfterThrowing)等时机执行。Spring使用动态代理和CGLIB代理来实现AOP,拦截链就是这些代理对象在方法调用时将各个通知链接起来,从而实现了横切关注点的逻辑插入。
Step 2
Q:: Spring AOP中的通知类型有哪些?
A:: Spring AOP中的通知类型主要有五种:Before(前置通知),在目标方法执行前执行;After(后置通知),在目标方法执行后执行,无论是否发生异常;AfterReturning(返回后通知),在目标方法成功执行后执行;AfterThrowing(异常通知),在目标方法抛出异常后执行;Around(环绕通知),包围目标方法的执行,既可以在方法前执行,也可以在方法后执行。
Step 3
Q:: Spring AOP和AspectJ有什么区别?
A:: Spring AOP是一种运行时增强的AOP实现,主要基于代理机制,只能增强Spring管理的Bean。而AspectJ是一种编译时增强的AOP实现,功能更强大,支持更复杂的切入点表达式,可以增强任意对象,不局限于Spring管理的Bean。
Step 4
Q:: 如何在Spring中定义一个切面?
A:: 在Spring中定义一个切面可以通过注解或XML配置来实现。通过注解方式,使用@Aspect注解定义切面类,并使用@Pointcut定义切入点,@Before、@After、@Around等注解定义通知。在XML配置中,使用<aop:aspect>和<aop:pointcut>
等标签定义切面和切入点。
Step 5
Q:: Spring AOP的底层实现机制是什么?
A:: Spring AOP的底层实现机制主要有两种:JDK动态代理和CGLIB代理。JDK动态代理基于接口,如果目标类实现了接口,Spring会使用JDK动态代理创建代理对象。CGLIB代理基于子类,如果目标类没有实现接口,Spring会使用CGLIB库生成目标类的子类作为代理对象。