Spring相关面试题

Spring IOC 和 AOP

  • Spring IOC
    Inverse of Control 控制反转,将原本在程序中手动创建对象的控制权交给Spring框架的进行管理,由**IOC容器完成对象的依赖注入(DI)**,ICO容器实际上就是个key-value形式的map。使对象间的耦合降低,资源更易于管理。
  • Spring AOP
    Aspect oriented programming 面向切面编程,基于动态代理,将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性

Spring Bean 的生命周期和作用域

生命周期:实例化 -> 属性赋值 -> 初始化 -> 销毁

1
2
3
4
1. 实例化:Spring 通过构造方法或工厂方法创建 Bean 实例。
2. 属性赋值:Spring IOC容器将 Bean 的属性值注入到 Bean 实例中。
3. 初始化:Spring 调用 Bean 的初始化方法,完成 Bean 的初始化工作。
4. 销毁:当 Bean 不再需要时,Spring 会调用 Bean 的销毁方法,完成 Bean 的销毁工作。

作用域:

  • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
  • prototype : 每次请求都会创建一个新的 bean 实例。
  • request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP- request 内有效。
  • session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP- session 内有效。
  • global-session : 全局 session 作用域,仅仅在基于 Portlet 的 web 应用中才有意义,Spring5 已经没有了。Portlet 是能够生成语义代码(例如:HTML)片段的小型 Java Web 插件。它们基于 portlet 容器,可以像 servlet 一样处理 HTTP 请求。但是,与 servlet 不同,每个 portlet 都有不同的会话

常用注解

Spring中常用的注解

  • @Component :通用的注解,可标注任意类为 Spring 组件
  • @ComponentScan:定义要扫描的路径,从中找出标识了需要装配的类自动装配到- Spring 的 bean 容器中
  • @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作
  • @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层
  • @Autowired:Spring 内置的注解,默认的注入方式为byType,可以通过- @Qualifier 注解来指定名称
  • @Resource:JDK 提供的注解,默认注入方式为 byName,有 name 和 type 两个属性

    SpringMVC常用注解

  • @Controller:声明MVC的控制层,主要用户接受用户请求并调用 Service 层返回数- 给前端页面
  • @RestController:组合了@Controller和@ResponseBody,表明只进行数据交互
  • @RequestMapping:用来映射Web请求的路径、参数、处理类的方法
  • @RequestBody:用于获取请求体内容
  • @ResponseBody:表明接收返回数据而非一个页面
  • @RequestParam:请求数据绑定到某个简单对象
  • @PathVariable:用于绑定 url 中的占位符

SpringMVC执行过程

  1. 浏览器请求过来,发送到DispatcherServlet前端控制器
  2. DispatcherServlet根据请求信息匹配对应的处理器映射器HandlerMapping,解请求对应的Handler
  3. 解析到对应Handler后,再由处理器适配器HandlerAdapter处理
  4. HandlerAdapter根据Handler调用真正的处理器(controller)处理相应的业务辑
  5. 处理完成后返回ModelAndView对象到前端控制器,Model是数据,View是逻辑view
  6. 前端控制器发送ModelAndView到视图解析器ViewResolve,解析后返回具体View
  7. 前端控制器对View进行视图渲染
  8. 最后前端控制器将视图返回给浏览器

spring的事物失效的场景

  1. 访问权限非public
  2. Bean没有被spring管理
  3. 方法被final修饰了
  4. 数据库不支持事务
  5. 同一类中方法的内部调用
  6. 未配置事务管理器
  7. 未正确地捕获异常