Spring相关面试题 | 青训营

97 阅读4分钟

核心

  1. 控制反转(IoC)和依赖注入(DI):

    • Spring 的核心思想是控制反转和依赖注入,它通过容器管理对象的创建和依赖关系的注入。
    • 控制反转:将对象的创建和依赖关系的管理交给 Spring 容器,而不是在代码中直接创建和管理对象。
    • 依赖注入:通过注入依赖,将对象之间的关系解耦,提高代码的可维护性和可测试性。
  2. 面向切面编程(AOP):

    • Spring 支持面向切面编程,用于将与业务逻辑无关的横切关注点(如日志、事务、安全性等)从业务逻辑中分离出来。
    • AOP 可以通过代理机制实现,或者通过字节码增强技术来实现。
  3. 数据访问和集成:

    • Spring 提供了对常见持久化框架(如 JDBC、Hibernate、MyBatis)的集成支持,简化了数据库访问的开发。
    • Spring 还提供了对消息队列、远程调用、Web 服务、缓存等的集成支持,使得不同系统之间的集成更加方便。
  4. MVC 框架:

    • Spring MVC 是 Spring 框架中的一个模块,用于构建 Web 应用程序。
    • 它基于模型-视图-控制器(MVC)的设计模式,将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分。
    • Spring MVC 提供了灵活的请求处理、视图解析、数据绑定等功能,使得开发 Web 应用程序更加简单和可维护。
  5. 安全性:

    • Spring Security 是 Spring 框架的一个模块,用于提供身份验证和授权功能,保护应用程序的安全性。
    • 它支持各种认证方式(如基于表单、基本认证、OAuth 等),并且可以与其他安全框架(如 LDAP、CAS)集成。
  6. 测试支持:

    • Spring 提供了丰富的测试支持,包括单元测试、集成测试和端到端测试。
    • 它提供了对 JUnit、Mockito、TestNG 等测试框架的集成支持,以及模拟对象、事务管理、测试数据库等功能。

AOP增强时机

AOP(面向切面编程)是一种编程范式,它通过在程序中划定切面(关注点),并在预定的时机(增强时机)插入额外的代码来实现横切关注点的模块化。增强时机是指在目标方法执行过程中,AOP 框架插入切面代码的时机。

在 AOP 中,常见的增强时机有以下几种:

  1. 前置增强(Before):在目标方法执行之前执行切面代码。可以用于执行一些准备操作或参数验证等。

  2. 后置增强(After):在目标方法执行之后执行切面代码。可以用于执行一些清理操作或记录日志等。

  3. 返回增强(After-returning):在目标方法成功执行并返回结果后执行切面代码。可以用于处理目标方法的返回值或进行其他操作。

  4. 异常增强(After-throwing):在目标方法抛出异常后执行切面代码。可以用于处理目标方法的异常情况或进行异常处理。

  5. 环绕增强(Around):在目标方法执行前后都执行切面代码。可以用于完全控制目标方法的执行过程,包括是否执行目标方法、修改输入参数、修改返回结果等。

增强时机的选择取决于你的具体需求和切面逻辑。通过选择合适的增强时机,你可以在不侵入目标代码的情况下,将横切关注点的逻辑模块化,并在不同的时机执行相应的切面代码。

请注意,增强时机的具体实现可能依赖于使用的 AOP 框架或库,例如在 Spring 框架中,可以使用注解或配置来指定增强时机。

Spring Bean的生命周期

  1. 实例化(Instantiation):在这个阶段,Spring 根据配置信息或者注解创建 Bean 的实例。这可以通过构造函数实例化或者工厂方法进行。

  2. 属性赋值(Population):一旦 Bean 实例化完成,Spring 会通过依赖注入或者属性注入的方式为 Bean 的属性赋值。这可以通过 XML 配置文件、注解或者 Java Config 进行。

  3. 初始化(Initialization):在属性赋值完成后,Spring 会调用 Bean 的初始化方法进行一些额外的自定义初始化操作。Bean 可以实现 InitializingBean 接口,或者使用 @PostConstruct 注解来标记初始化方法。

  4. 使用(In Use):一旦 Bean 初始化完成,它就可以被应用程序使用了。在这个阶段,Bean 可以响应业务逻辑的调用,处理请求等。

  5. 销毁(Destruction):当应用程序关闭或者 Spring 容器销毁时,Spring 会调用 Bean 的销毁方法进行一些清理操作。Bean 可以实现 DisposableBean 接口,或者使用 @PreDestroy 注解来标记销毁方法。