1.简介
在本文中,我们将介绍一些在求职面试中可能会出现的与Spring相关的最常见问题。
2. Spring 核心
Q1. 什么是Spring Framework?
Spring是Java Enterprise Edition应用程序开发中使用最广泛的框架。Spring的核心功能可用于开发任何Java应用程序。
我们可以使用它的扩展来在Java EE平台上构建各种Web应用程序,或者我们可以在简单的独立应用程序中使用它的依赖注入规定。
Q2. 使用Spring有什么好处?
Spring旨在简化Java EE开发。以下是使用它的优点:
- 轻量级:在开发中使用框架有一点点开销
- 控制反转(IoC): Spring容器负责处理各种对象的依赖关系,而不是创建或查找依赖对象
- 面向切面编程(AOP): Spring支持AOP将业务逻辑与系统服务分开
- IoC容器:它管理Spring Bean生命周期和项目特定配置
- MVC框架:用于创建Web应用程序或RESTful Web服务,能够返回XML / JSON响应
- 事务管理:通过使用Java注释或Spring Bean XML配置文件减少JDBC操作,文件上载等中的样板代码量
- 异常处理: Spring提供了一些方便的API,用于将特定于技术的异常转换为未经检查的异常
Q3. 你知道哪些Spring子项目?简要描述一下。
- Core - 提供框架基本部分的关键模块,如IoC或DI
- JDBC - 此模块启用JDBC抽象层,无需对特定供应商数据库执行JDBC编码
- ORM集成 - 为流行的对象关系映射API提供集成层,例如JPA,JDO和Hibernate
- Web - 面向Web的集成模块,提供多部分文件上载,Servlet侦听器和面向Web的应用程序上下文功能
- MVC框架 - 实现模型视图控制器设计模式的Web模块
- AOP模块 - 面向方面的编程实现,允许定义干净的方法 - 拦截器和切入点
Q4. 什么是依赖注入?
依赖注入是控制反转(IoC)的一个方面,它是一个通用概念,表明您不是手动创建对象,而是描述应如何创建它们。如果需要,IoC容器将实例化所需的类。
Q5. 我们如何在Spring中注入豆子?
存在一些不同的选择:
- Setter注入
- 构造函数注入
- 属性注射
可以使用XML文件或注释完成配置。
Q6. 注入Bean的最佳方法是什么?为什么?
建议的方法是使用构造函数参数用于强制依赖项,将setter用于可选依赖项。构造函数注入允许将值注入不可变字段并使测试更容易。
Q7. BeanFactory和ApplicationContext有什么区别?
BeanFactory是一个表示提供和管理bean实例的容器的接口。默认实现在调用getBean()时懒惰地实例化bean 。
ApplicationContext是一个接口,表示容纳应用程序中所有信息,元数据和bean的容器。它还扩展了BeanFactory接口,但默认实现在应用程序启动时急切地实例化bean。可以为单个bean覆盖此行为。
有关所有差异,请参阅参考。
Q8. 什么是Spring Bean?
Spring Bean是由Spring IoC容器初始化的Java对象。
Q9. Spring框架中的默认bean范围是什么?
默认情况下,Spring Bean初始化为单例。
Q10. 如何定义bean的范围?
要设置Spring Bean的范围,我们可以在XML配置文件中使用@Scope批注或“scope”属性。有五个支持的范围:
- singleton
- prototype
- request
- session
- global-session
有关差异,请参阅此处。
Q11. 单例Bean是线程安全的吗?
不,单例bean不是线程安全的,因为线程安全是关于执行的,而单例是一种专注于创建的设计模式。线程安全仅取决于bean实现本身。
Q12. Spring bean生命周期是什么样的?
首先,需要基于Java或XML bean定义来实例化Spring bean。可能还需要执行一些初始化以使其进入可用状态。之后,当不再需要bean时,它将从IoC容器中删除。
所有初始化方法的整个流程显示在图片(源)上:
Q13. 什么是基于Spring Java的配置?
这是以类型安全的方式配置基于Spring的应用程序的方法之一。它是基于XML的配置的替代方案。
Q14. 我们可以在一个项目中拥有多个Spring配置文件吗?
是的,在大型项目中,建议使用多个Spring配置以提高可维护性和模块性。
您可以加载多个基于Java的配置文件:
@Configuration
@Import({MainConfig.class, SchedulerConfig.class})
public class AppConfig {
或者加载一个包含所有其他配置的XML文件:
ApplicationContext context = new ClassPathXmlApplicationContext("spring-all.xml");
在这个XML文件中你将拥有:
Q15. 什么是Spring Security?
Spring Security是Spring框架的一个独立模块,专注于在Java应用程序中提供身份验证和授权方法。它还会处理大多数常见的安全漏洞,例如CSRF攻击。
要在Web应用程序中使用Spring Security,您可以开始使用简单的注释:@EnableWebSecurity。
Q16. 什么是Spring Boot?
Spring Boot是一个项目,它提供了一组预先配置的框架,以减少样板配置,以便您可以使用最少量的代码启动并运行Spring应用程序。
Q17. 列举一些Spring Framework中使用的设计模式?
- 单例模式:单例范围的bean
- 工厂模式: Bean工厂类
- 原型模式:原型范围的bean
- 适配器模式: Spring Web和Spring MVC
- 代理模式:面向Spring Aspect的编程支持
- 模板方法模式: JdbcTemplate,HibernateTemplate等。
- Front Controller: Spring MVC DispatcherServlet
- 数据访问对象: Spring DAO支持
- 模型视图控制器: Spring MVC
Q18. Prototype的作用范围如何?
范围原型意味着每次调用Bean的实例时,Spring都会创建一个新实例并返回它。这与默认的单例范围不同,其中每个Spring IoC容器实例化一个对象实例。
3. Spring Web MVC
Q19. 如何在Spring Bean中获取ServletContext和ServletConfig对象?
你可以通过以下方式做到:
- 实现Spring感知接口。
- 在这些bean上使用@Autowired注释:
@Autowired
ServletContext servletContext;
@Autowired
ServletConfig servletConfig;
Q20. 什么是Spring MVC中的Controller?
简而言之,DispatcherServlet处理的所有请求都定向到使用@Controller注释的类。每个控制器类将一个或多个请求映射到使用提供的输入处理和执行请求的方法。
Q21. @RequestMapping注释如何工作?
该@RequestMapping注解用于映射Web请求Spring控制器的方法。除了简单的用例之外,我们还可以使用它来映射HTTP头,使用@PathVariable绑定URI的部分,以及使用URI参数和@RequestParam注释。
4. Spring数据访问
Q22. 什么是Spring JDBCTemplate类以及如何使用它?
Spring JDBC模板是我们可以通过它访问我们感兴趣的数据库操作逻辑的主要API:
- 创建和关闭连接
- 执行语句和存储过程调用
- 迭代ResultSet并返回结果
要使用它,我们需要定义DataSource的简单配置:
@Configuration
@ComponentScan("org.baeldung.jdbc")
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("guest_user");
dataSource.setPassword("guest_password");
return dataSource;
}
}
Q23. 你将如何在Spring启动任务?他们有什么好处?
配置事务有两种不同的方式- 使用注释或使用面向切面编程(AOP) - 每种方法都有其优点。
根据官方文档,使用Spring Transactions的好处是:
- 跨不同的事务API(如JTA,JDBC,Hibernate,JPA和JDO)提供一致的编程模型
- 支持声明式事务管理
- 为程序化事务管理提供比一些复杂事务API(如JTA)更简单的API
- 与Spring的各种数据访问抽象集成得非常好
Q24. 什么是SpringDAO?
Spring Data Access Object是Spring提供的支持,用于以一致且简单的方式使用JDBC,Hibernate和JPA等数据访问技术。
5. Spring面向切面编程(AOP)
Q25. 什么是面向方面编程?
通过在不修改受影响的类的情况下向现有代码添加额外行为,方面可以实现跨领域关注的模块化,例如跨越多种类型和对象的事务管理。
Q26. AOP 中的Aspect,Advice,Pointcut和JoinPoint是什么?
- 方面:实现跨领域关注的类,例如事务管理
- 建议:在应用程序中达到具有匹配 Pointcut的特定 JoinPoint时执行的方法
- 切入点:一组与 JoinPoint匹配的正则表达式,用于确定是否需要执行建议
- JoinPoint:执行程序期间的一个点,例如方法的执行或异常的处理
Q27. 什么是Weaving?
根据官方文档,Weaving是一个将切面与其他应用程序类型或对象链接以创建建议对象的过程。这可以在编译时,加载时或运行时完成。与其他纯Java AOP框架一样,Spring AOP 在运行时执行编织。
6.Spring5
Q28. 什么是反应式编程?
反应式编程是关于非阻塞,事件驱动的应用程序,可以通过少量线程进行扩展,背压是一个关键因素,旨在确保生产者不会压倒消费者。
反应式编程的主要好处是:
- 提高多核和多CPU硬件上计算资源的利用率
- 通过减少序列化来提高性能
与反应系统相反,反应式编程通常是事件驱动的,而反应式系统是消息驱动的。因此,使用反应式编程并不意味着我们正在构建一个反应系统,这是一种架构风格。
但是,如果我们遵循“ 反应性宣言”(Reactive Manifesto),反应性规划可以用作实施反应系统的手段 ,这对于理解非常重要。
基于此,反应系统具有四个重要特征:
- 响应:系统应及时响应
- 弹性:如果系统面临任何故障,它应该保持响应
- 弹性:反应系统可以对变化做出反应,并在不同的工作负载下保持响应
- 消息驱动:反应系统需要依靠异步消息传递在组件之间建立边界
Q29. 什么是Spring WebFlux?
Spring WebFlux 是Spring的反应堆栈Web框架,它是Spring MVC的替代品。
为了实现这种反应模型并具有高度可扩展性,整个堆栈是非阻塞的。
Q30. 什么是单声道和磁通类型?
Spring Framework 5中的WebFlux框架使用Reactor作为其异步基础。
该项目提供两种核心类型: Mono表示单个异步值,Flux表示异步值流。它们都实现了Reactive Streams 规范中定义的 Publisher接口 。
Mono实现Publisher并返回0或1个元素:
public abstract class Mono implements Publisher {...}
此外,Flux实现Publisher并返回N个元素:
public abstract class Flux implements Publisher {...}
根据定义,这两种类型代表流,因此它们都是惰性的,这意味着在我们使用subscribe()方法使用流之前不执行任何操作。两种类型都是不可变的,因此调用任何方法都将返回Flux或Mono的新实例。
Q31. 什么是使用Web客户端和WebTestClient的?
WebClient是新Web Reactive框架中的一个组件,可以充当执行非阻塞HTTP请求的响应客户端。作为一个被动的客户端,它可以处理具有背压的反应流,并且它可以充分利用Java 8 lambdas。它还可以处理同步和异步方案。
另一方面, WebTestClient 是一个类似的类,我们可以在测试中使用它。基本上,它是围绕WebClient的薄外壳。它可以通过HTTP连接连接到任何服务器。它还可以使用模拟请求和响应对象直接绑定到WebFlux应用程序,而无需HTTP服务器。
Q32. 使用Reactive Streams有什么缺点?
使用反应流的主要缺点是:
对Reactive应用程序进行故障排除有点困难; 一定要查看我们 关于调试反应流的教程, 以获得一些方便的调试技巧
对反应式数据存储的支持有限,因为传统的关系数据存储尚未采用反应式范例
实施时还有一个额外的学习曲线
Q33. Spring 5是否与旧版本的Java兼容?
为了利用Java 8的特性,Spring代码库得到了改进。这意味着无法使用旧版本的Java。因此,该框架至少需要Java 8。
Q34. Spring 5如何与JDK 9模块化集成?
在Spring5,一切都已模块化,因此我们不会被迫进口可能没有我们正在寻找的功能的罐子。
让我们看一个例子来理解Java 9中的新模块功能以及如何基于这个概念组织Spring 5项目。
首先,让我们创建一个包含单个方法的新类,以返回String “HelloWorld”。我们将它放在一个新的Java项目中 - HelloWorldModule:
package com.hello;
public class HelloWorld {
public String sayHello(){
return "HelloWorld";
}
}
然后让我们创建一个新模块:
module com.hello {
export com.hello;
}
现在,让我们创建一个新的Java项目 HelloWorldClient,通过定义一个模块来使用上面的模块:
module com.hello.client {
requires com.hello;
}
以上模块现在可供测试:
public class HelloWorldClient {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorld();
log.info(helloWorld.sayHello());
}
}
Q35. 我们可以在同一个应用程序中同时使用Web MVC和WebFlux吗?
截至目前,Spring Boot将只允许Spring MVC或Spring WebFlux,因为Spring Boot会尝试根据其类路径中存在的依赖关系自动配置上下文。
另外,Spring MVC无法在Netty上运行。此外,MVC是一种阻塞范式,而WebFlux是一种非阻塞风格,因此我们不应将它们混合在一起,因为它们用于不同的目的。
7.结论
在这篇广泛的文章中,我们探讨了一些关于Spring的技术访谈的一些最重要的问题。
欢迎大家关注公众号:「Java知己」,关注公众号,回复「1024」你懂得,免费领取 30 本经典编程书籍。关注我,与 10 万程序员一起进步。 每天更新Java知识哦,期待你的到来!