Java 面试机经(初级篇-15期)

Java 面试机经(初级篇-15期)

Java 面试机经(初级篇-15期)

  1. 什么是 AOP?
    答案:
    AOP(Aspect-Oriented Programming), 即 面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率

  2. 什么是 Aspect?
    答案:
    AOP 通过促进另一种模块性补充了面向对象的编程,该模块性将横切关系广泛分布的实现聚拢到一个单元。这种单元称为 Aspect,它由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP 就是负责实施切面的框架, 它将切面所定义的横切逻辑编织到切面所指定的连接点中.
    AOP 的工作重心在于如何将增强编织目标对象的连接点上, 这里包含两个工作:
    如何通过 pointcut 和 advice 定位到特定的joinpoint上如何在 advice 中编写切面代码.
    可以简单地认为, 使用 @Aspect 注解的类就是切面.

  3. 什么是连接点(JoinPoint)
    答案:
    程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理,简单来讲和方法有关的前前后后都是连接点。

  4. 什么是通知(Advice)?
    答案:
    通知是个在方法执行前或执行后要做的动作,实际上就是程序执行时要通过 SpringAOP 框架时触发的代码段。

  5. 有哪些类型的通知(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 注解标记进行配置。

  6. Spring 如何保证 Controller 并发安全问题?
    答案:
    一般情况下 Controller、Service、DAO 层级中的作用域都是单例模式;而每个 Request 都是单独的线程,所以即使在同一时间访问同一个控制器对象,不修改 Controller 对象,则不需要做同步处理                                                    并发安全的原因就在于 Controller 对象是单例的,那么如果不小心在类中定义了类变量,那么这个类变量是被所有请求共享的,这可能会造成多个请求修改该变量的值,出现与预期结果不符合的异常。所以尽量不要在 Controller 中使用实例变量。这样可以很大程度保证线程安全性了。                                可以使用 ThreadLocal 来保存类变量,将类变量保存在线程的变量域中,让不同的请求隔离开来。

  7. Spring 支持的事务管理方式
    答案:
    编程式事务管理:这意味着你可以通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。例如使用 TransactionTemplate 和直接使用PlatformTransactionManager。
    声明式事务管理:这种方式意味着你可以将事务管理和业务代码分离。例如 AOP 切面和注解@Transactional ,它与编程式事务相比,只能作用到方法级别

  8. Spring 框架的事务管理有哪些优点?
    答案:
    在以往的 JDBCTemplate 中事务提交成功,异常处理都是通过 Try/Catch 来完成,而在 Spring中。Spring 容器集成了 TransactionTemplate,封装了所有对事务处理的功能,包括异常时事务回滚,操作成功时数据提交等复杂业务功能。这都是由 Spring 容器来管理,大大减少了程序员的代码量,也对事务有了很好的管理控制。

  9. Spring MVC 的主要组件有哪些?
    答案:
    前端控制器 DispatcherServlet(不需要程序员开发)
    作用:接收请求、响应结果,相当于转发器,有了 DispatcherServlet 就减少了其他组件之间的耦合度。
    处理器映射器 HandlerMapping(不需要程序员开发)
    作用:根据请求的 URL 来查找 Handler。
    处理器适配器 HandlerAdapter
    注意:在编写 Handler 的时候要按照 HandlerAdapter 要求的规则去编写,这样适配器
    HandlerAdapter 才可以正确的去执行 Handler。
    处理器 Handler(需要程序员开发)
    视图解析器 ViewResolver(不需要程序员开发)
    作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view)
    视图 View(需要程序员开发 jsp)
    View 是一个接口,它的实现类支持不同的视图类型(jsp、freemarker、pdf 等)

  10. 简述 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 响应用户

上一篇:2. SpringMVC组件解析 - SpringMVC 的执行流程


下一篇:SpringMVC--DispatcherServlet