-
什么是 AOP?
答案:
AOP(Aspect-Oriented Programming), 即 面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率 -
什么是 Aspect?
答案:
AOP 通过促进另一种模块性补充了面向对象的编程,该模块性将横切关系广泛分布的实现聚拢到一个单元。这种单元称为 Aspect,它由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中.
AOP 的工作重心在于如何将增强编织目标对象的连接点上, 这里包含两个工作:
如何通过 pointcut 和 advice 定位到特定的joinpoint上如何在 advice 中编写切面代码.
可以简单地认为, 使用 @Aspect 注解的类就是切面. -
什么是连接点(JoinPoint)
答案:
程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理,简单来讲和方法有关的前前后后都是连接点。 -
什么是通知(Advice)?
答案:
通知是个在方法执行前或执行后要做的动作,实际上就是程序执行时要通过 SpringAOP 框架时触发的代码段。 -
有哪些类型的通知(Advice)?
答案:
1)Before:这些类型的 Advice 在 joinpoint 方法之前执行,使用 @Before 注解标记进行配置。
2)After:这些类型的 Advice 在连接点方法之后执行,无论方法退出是正常还是异常返回,
使用@After 注解标记进行配置。
3)After Returning:这些类型的 Advice 在连接点方法正常执行后执行,使用@AfterReturning注解标记进行配置。
4)After Throwing:这些类型的 Advice 仅在joinpoint 方法通过抛出异常退出,使用@AfterThrowing 注解标记进行配置。
5)Around:环绕通知,这些类型的 Advice 在连接点之前和之后执行,使用 @Around 注解标记进行配置。 -
Spring 如何保证 Controller 并发安全问题?
答案:
一般情况下 Controller、Service、DAO 层级中的作用域都是单例模式;而每个 Request 都是单独的线程,所以即使在同一时间访问同一个控制器对象,不修改 Controller 对象,则不需要做同步处理 并发安全的原因就在于 Controller 对象是单例的,那么如果不小心在类中定义了类变量,那么这个类变量是被所有请求共享的,这可能会造成多个请求修改该变量的值,出现与预期结果不符合的异常。所以尽量不要在 Controller 中使用实例变量。这样可以很大程度保证线程安全性了。 可以使用 ThreadLocal 来保存类变量,将类变量保存在线程的变量域中,让不同的请求隔离开来。 -
Spring 支持的事务管理方式
答案:
编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。例如使用 TransactionTemplate 和直接使用PlatformTransactionManager。
声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。例如 AOP 切面和注解@Transactional ,它与编程式事务相比,只能作用到方法级别 -
Spring 框架的事务管理有哪些优点?
答案:
在以往的 JDBCTemplate 中事务提交成功,异常处理都是通过 Try/Catch 来完成,而在 Spring中。Spring 容器集成了 TransactionTemplate,封装了所有对事务处理的功能,包括异常时事务回滚,操作成功时数据提交等复杂业务功能。这都是由 Spring 容器来管理,大大减少了程序员的代码量,也对事务有了很好的管理控制。 -
Spring MVC 的主要组件有哪些?
答案:
前端控制器 DispatcherServlet(不需要程序员开发)
作用:接收请求、响应结果,相当于转发器,有了 DispatcherServlet 就减少了其他组件之间的耦合度。
处理器映射器 HandlerMapping(不需要程序员开发)
作用:根据请求的 URL 来查找 Handler。
处理器适配器 HandlerAdapter
注意:在编写 Handler 的时候要按照 HandlerAdapter 要求的规则去编写,这样适配器
HandlerAdapter 才可以正确的去执行 Handler。
处理器 Handler(需要程序员开发)
视图解析器 ViewResolver(不需要程序员开发)
作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
视图 View(需要程序员开发 jsp)
View 是一个接口,它的实现类支持不同的视图类型(jsp、freemarker、pdf 等) -
简述 SpringMVC 的工作流程。
答:
1)用户发送请求至前端控制器 DispatcherServlet;
2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器;
3)HandlerMapping 根据请求 URL 找到具体的处理器,生成处理器对象以及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet;
4)DispatcherServlet 通过 HandlerAdapter 处理器适配器调用处理器;
5)执行处理器(Controller,也叫后端控制器);
6)Controller 执行完成返回 ModelAndView;
7)HandlerAdapter 将 Controller 执行结果 ModelAndView 返回给 DispatcherServlet;
8)DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器;
9)ViewReslover 解析后返回具体 View;
10)DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中);
11)DispatcherServlet 响应用户