热门 Spring 框架问题

1.Spring核心

1.1.什么是Spring框架?

Spring 是用于开发 Java Enterprise Edition 应用程序的最广泛使用的框架。 此外,Spring 的核心特性可用于开发任何 Java 应用程序。

使用它的扩展在 Jakarta EE 平台之上构建各种 Web 应用程序。 也可以在简单的独立应用程序中使用它的依赖注入的特性。

1.2.使用 Spring 有什么好处?

Spring 的目标是让 Jakarta EE 开发更容易:

  • 轻量级 - 在开发中使用该框架有轻微的开销。
  • 控制反转 (IoC) – Spring 容器负责连接各种对象的依赖关系,而不是创建或查找依赖对象。
  • 面向切面的编程(AOP)——Spring 支持 AOP 将业务逻辑与系统服务分开。
  • IoC 容器——管理 Spring Bean 生命周期和项目特定的配置
  • MVC 框架——用于创建 Web 应用程序或 RESTful Web 服务,能够返回 XML/JSON 响应
  • 事务管理 - 通过使用 Java 注释或 Spring Bean XML 配置文件减少 JDBC 操作、文件上传等中的样板代码量
  • 异常处理——Spring 提供了一个方便的 API 来将特定于技术的异常转换为未经检查的异常。

1.3.Spring有哪些子项目?

  • Core-提供框架基本部分的关键模块,例如 IoC 或 DI
  • JDBC-启用 JDBC 抽象层,无需为特定供应商数据库进行 JDBC 编码
  • ORM集成-为流行的对象关系映射 API 提供集成层,例如 JPA、JDO 和 Hibernate
  • Web-一个面向 Web 的集成模块,提供分段文件上传、Servlet 监听器和面向 Web 的应用程序上下文功能
  • MVC框架-实现模型视图控制器设计模式的 Web 模块
  • AOP模块-面向切面的编程实现允许定义干净的方法拦截器和切入点

1.4.什么是依赖注入?

依赖注入是控制反转 (IoC) 的一个方面,是一个通用概念,它表明我们不会手动创建对象,而是描述它们应该如何创建。 然后,如果需要,IoC 容器将实例化所需的类。

1.5.如何在 Spring 中注入 Bean?

为了注入 Spring bean,存在一些不同的选项:

  • setter手注入
  • 构造函数注入
  • 字段注入注入
    可以使用 XML 文件或注解来完成配置。

1.6.哪种注入 Bean 的最佳方式是什么?为什么?

推荐的方法是对强制依赖项使用构造函数参数,对可选依赖项使用 setter。 这是因为构造函数注入允许向不可变字段注入值并使测试更容易。

1.7.BeanFactory 和 ApplicationContext 有什么区别?

BeanFactory 是一个接口,表示提供和管理 bean 实例的容器。 默认实现在调用 getBean() 时延迟实例化 bean。

相比之下,ApplicationContext 是一个接口,代表一个容器,其中包含应用程序中的所有信息、元数据和 bean。 它还扩展了 BeanFactory 接口,但默认实现会在应用程序启动时急切地实例化 bean。 但是,可以为单个 bean 覆盖此行为。

1.8.什么是 Spring Bean?

Spring Bean 是由 Spring IoC 容器初始化的 Java 对象。

1.9.Spring 框架中的默认 Bean 范围是什么?

默认情况下,Spring Bean 被初始化为单例。

1.10.如何定义 Bean 的作用域?

为了设置Spring Bean的作用域,可以在XML配置文件中使用@Scope注解或“scope”属性。 请注意,有五个受支持的范围:

  • Singleton
  • Prototype
  • Request
  • Session
  • Global-session

1.11.单例 Bean 是线程安全的吗?

不,单例 bean 不是线程安全的,因为线程安全是关于执行的,而单例是一种专注于创建的设计模式。 线程安全仅取决于 bean 实现本身。

1.12.Spring Bean 生命周期是什么样的?

首先,需要根据 Java 或 XML bean 定义实例化 Spring bean。 可能还需要执行一些初始化以使其进入可用状态。 之后,当不再需要 bean 时,它将从 IoC 容器中删除。

1.13.什么是基于 Spring Java 的配置?

这是以类型安全的方式配置基于 Spring 的应用程序的方法之一。 它是基于 XML 的配置的替代方案。

1.14.可以在一个项目中拥有多个 Spring 配置文件吗?

可以,在大型项目中,建议使用多个 Spring 配置以提高可维护性和模块化。

可以加载多个基于 Java 的配置文件:

@Configuration
@Import({
     MainConfig.class, SchedulerConfig.class})
public class AppConfig {
     

1.15.什么是 Spring security?

Spring Security 是 Spring 框架的一个独立模块,它专注于在 Java 应用程序中提供身份验证和授权方法。 它还处理了大多数常见的安全漏洞,例如 CSRF 攻击。

要在 Web 应用程序中使用 Spring Security,可以从简单的注解 @EnableWebSecurity 开始。

1.16.什么是 Spring Boot?

Spring Boot 是一个提供预配置框架集以减少样板配置的项目。 通过这种方式,可以使用最少的代码启动并运行 Spring 应用程序。

1.17.列举一些 Spring 框架中使用的设计模式?

单例模式——单例范围的bean
工厂模式——Bean 工厂类
原型模式——原型范围的bean
适配器模式 – Spring Web 和 Spring MVC
代理模式——Spring Aspect-Oriented Programming 支持
模板方法模式——JdbcTemplate、HibernateTemplate 等。
前端控制器 – Spring MVC DispatcherServlet
数据访问对象——Spring DAO 支持
模型视图控制器 – Spring MVC

1.18.范围原型如何工作?

范围原型意味着每次调用 Bean 的实例时,Spring 都会创建一个新实例并返回它。 这与默认的单例作用域不同,默认的单例作用域每个 Spring IoC 容器实例化单个对象实例一次。

2. Spring Web MVC

2.1.如何在 Spring Bean 中获取 ServletContext 和 ServletConfig 对象?

可以通过实现 Spring-aware 接口来实现。 完整列表可在此处获得。

还可以在这些 bean 上使用 @Autowired 注解:

@Autowired
ServletContext servletContext;

@Autowired
ServletConfig servletConfig;

2.2.Spring MVC 中的控制器是什么?

简单来说,DispatcherServlet 处理的所有请求都被定向到用@Controller 注解的类。 每个控制器类将一个或多个请求映射到使用提供的输入处理和执行请求的方法。

2.3.@RequestMapping 注解是如何工作的?

@RequestMapping 注解用于将 Web 请求映射到 Spring Controller 方法。 除了简单的用例之外,还可以使用它来映射 HTTP 标头、将 URI 的一部分与 @PathVariable 绑定,以及使用 URI 参数和 @RequestParam 注释。

3.Spring 数据访问

3.1.什么是 Spring JdbcTemplate 类以及如何使用它?

Spring JDBC 模板是主要的 API,通过它可以实现据库操作逻辑:

  • 创建和关闭连接
  • 执行语句和存储过程调用
  • 迭代 ResultSet 并返回结果

为了使用,需要定义 DataSource 的简单配置:

@Configuration
@ComponentScan("com.spring.demo")
public class SpringJdbcConfig {
     
    @Bean
    public DataSource mysqlDataSource() {
     
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/springjdbc");
        dataSource.setUsername("user");
        dataSource.setPassword("password");
 
        return dataSource;
    }
}

3.2.如何在 Spring 中启用事务以及它们的好处是什么?

有两种不同的方式来配置事务——使用注解或使用面向方面的编程(AOP)——每种方法都有其优点。

根据官方文档,以下是使用 Spring Transactions 的好处:

  • 提供跨不同事务 API(例如 JTA、JDBC、Hibernate、JPA 和 JDO)的一致编程模型
  • 支持声明式事务管理
  • 为程序化事务管理提供比 JTA 等复杂事务 API 更简单的 API
  • 与 Spring 的各种数据访问抽象很好地集成

3.3.什么是 Spring DAO?

Spring 数据访问对象 (DAO) 是 Spring 提供的支持,用于以一致且简单的方式使用数据访问技术,如 JDBC、Hibernate 和 JPA。

4.Spring 面向切面编程

4.1.什么是面向切面编程(AOP)

切面通过向现有代码添加额外行为而不修改受影响的类来实现横切关注点的模块化,例如跨越多种类型和对象的事务管理。

4.2.AOP中的Aspect、Advice、Pointcut和JoinPoint是什么?

  • Aspect – 一个实现横切关注点的类,例如事务管理
  • Advice – 在应用程序中到达具有匹配切入点的特定 JoinPoint 时执行的方法
  • Pointcut – 一组与JoinPoint匹配的正则表达式,用于判断是否需要执行Advice
  • JoinPoint——程序执行过程中的一个点,例如方法的执行或异常的处理

4.3.什么是编织(Weaving)?

根据官方文档,编织是一个将方面与其他应用程序类型或对象联系起来以创建建议对象的过程。 这可以在编译时、加载时或运行时完成。 Spring AOP 与其他纯 Java AOP 框架一样,在运行时执行编织。

5.Spring5

5.1.什么是响应式编程?

反应式编程是关于非阻塞的、事件驱动的应用程序,它使用少量线程进行扩展,背压是一个关键因素,旨在确保生产者不会压倒消费者。

这些是反应式编程的主要好处:

  • 提高多核和多 CPU 硬件上计算资源的利用率=
  • 通过减少序列化来提高性能

反应式编程通常是事件驱动的,而反应式系统则是消息驱动的。 所以,使用反应式编程并不意味着正在构建一个反应式系统,这是一种架构风格。

但是,如果遵循响应式宣言,响应式编程可以用作实现响应式系统的一种手段,这对理解非常重要。

基于此,反应式系统具有四个重要特征:

  • 响应式——系统应及时响应。
  • 弹性 - 如果系统面临任何故障,它应该保持响应。
  • 伸缩– 反应式系统可以对变化做出反应并在不同的工作负载下保持响应。
  • 消息驱动——反应式系统需要依靠异步消息传递在组件之间建立边界。

5.2.什么是 Spring WebFlux?

Spring WebFlux 是 Spring 的响应式堆栈 Web 框架,它是 Spring MVC 的替代方案。

为了实现这种反应式模型并具有高度可扩展性,整个堆栈是非阻塞的。

你可能感兴趣的:(spring,java,spring)