Q:什么是AOP
概念:AOP既面向切象编程。是一种编程范式,主要用于将横切关注点从业务逻辑中脱离出来,以此来提高代码的模块化,和可维护性。
核心概念:
- 横切关注点(Cross-Cutting Concerns):多个模块中重复出现的与业务逻辑无关但又必须使用的代码,如日志记录,事务管理,权限校验
- 切面(Aspect):用于封装横切关注点的类。并且被
@Aspect注释。如:日志切面主要负责在方法前后添加日志记录。 - 通知(Advice):切面在特定切入点中执行的代码。有以下类型
- 前置通知(Before):方法执行前
- 后置通知(After):方法执行后(无论是否异常)
- 返回通知(After Returning):方法正常返回后
- 异常通知(After Throwing):方法抛出异常后
- 环绕通知(Around):包围方法执行,可自定义执行时机
- 切入点(Pointcut):定义通知应该在哪些连接点(方法)上执行,通常表达式(如 AspectJ 语法)
execution(* com.example.service.*.*(..))匹配所有服务层方法。 - 连接点(Join Point):程序执行过程中的特定点(如方法调用,异常抛出),是切入点的候选位置
- 织入(Weaving):将切面逻辑切入到目标对象的过程
- 编译时:如AspectJ的ajc编译器
- 类加载时:如使用类加载器增强
AOP的实现原理是什么
AOP(面向切面编程)的实现原理主要是动态代理。
AOP的动态代理有俩种JDK代理和CGLIB代理
1.JDK动态代理
原理:基于Java反射机制,在运行时创建目标接口的代理类,拦截方法调用并织入切面逻辑
优缺点:
- 纯java实现,无需额外的依赖
- 轻量级,运行时生成代理类速度快
- (缺点)仅支持接口,目标类必须至少实现一个接口
2.CGLIB代理
原理:通过继承子类,运行时生成子类,重写目标方法以织入切面逻辑
优缺点:
- 支持类代理,无需目标类实现接口
- final/方法不支持,无法代理有final修饰的类或方法
- 性能开销,生成代理类的速度低于JDK动态代理
Q:SpringMvc的执行流程
客户端通过url发送一个HTTP请求,SpringMvc的前端控制器DispatcherServlet会接收这个请求并调用HandlerMapper(映射器)来进行映射,返回一个HandlerExecutionChain(处理程序执行链)(包含处理器对象(Controller)和拦截器).前端控制器拿到这个执行链后会通过HandlerApdater(额打不特)(处理器适配器)的分析找到对应的控制器Controller。控制器执行完URL对应的方法中的逻辑后会返回一个ModelAndView。前端控制器接收到这个对象后又会调用视图解析器(ViewResolver)来解析视图对象。最后前端控制器将模型数据传递给视图对象后,渲染出HTML页面再由前端控制器返回给客户端