2024年春季求职面试:10大常见问题与完美答案指南
最近我发布了许多关于Spring教程的帖子。这篇帖子将帮助你通过详细解释核心概念来应对Spring面试问题。
Spring框架是最受欢迎的Java EE框架之一,用于Web应用程序。依赖注入和面向切面编程是Spring框架的核心。如果你擅长Spring框架,在Java面试中被选中的机会非常高。
专业技巧:核心Java是任何基于Java的框架的基础,因此如果你正在准备面试,那么请阅读核心Java面试问题和Java面试问题的文章。
Spring面试问题与答案
这里我提供了近50个Spring面试问题及其答案。它的更新范围涵盖了Spring 5,因此包含了最新的功能,例如用于响应式编程的Spring WebFlux。
1. Spring框架是什么?
Spring是Java EE框架中最广泛使用的之一。Spring框架的核心概念是”依赖注入”和”面向切面编程”。
使用Spring框架可以在普通的Java应用程序中实现组件之间的松耦合,通过实现依赖注入。通过Spring对面向切面编程的支持,我们还可以执行诸如日志记录和身份验证等横向领域任务。
我喜欢Spring,因为它提供了很多功能和不同的模块,用于特定任务,例如Spring MVC和Spring JDBC。由于Spring是一个开源框架,有许多在线资源和活跃的社区成员,所以使用Spring框架既容易又有趣。
推荐阅读:Spring框架。
Spring框架的一些重要特性是什么?
Spring框架是建立在两个设计概念之上的——依赖注入和面向切面编程。
Spring框架的一些特点包括:
- 轻量级且使用框架进行开发的开销非常小。
- 依赖注入或控制反转来编写相互独立的组件,Spring容器负责将它们连接在一起以实现我们的工作。
- Spring MVC框架可用于创建Web应用程序以及能够返回XML和JSON响应的RESTful Web服务。
- 支持事务管理、JDBC操作、文件上传、异常处理等,只需很少的配置,无论是通过注解还是通过Spring bean配置文件。
Spring IoC容器管理Spring Bean生命周期和项目特定配置,例如JNDI查找。
使用Spring框架有什么优势?
使用Spring框架的一些优点有:
- 减少应用程序不同组件之间的直接依赖关系。Spring IoC容器负责初始化资源或bean并将它们作为依赖项注入。
- 在Spring框架中编写单元测试用例很容易,因为我们的业务逻辑与实际资源实现类没有直接依赖关系。我们可以轻松编写测试配置并注入我们的模拟bean用于测试目的。
- 减少样板代码量,例如初始化对象、打开/关闭资源。我非常喜欢JdbcTemplate类,因为它帮助我们消除了JDBC编程中的所有样板代码。
- Spring框架分为几个模块,它帮助我们保持应用程序轻量级。例如,如果我们不需要Spring事务管理功能,就不需要将该依赖项添加到我们的项目中。
- Spring框架支持大多数Java EE功能,甚至更多。它始终处于新技术的前沿,例如,有一个用于Android的Spring项目,帮助我们为原生Android应用程序编写更好的代码。这使得Spring框架成为一个完整的包,我们不需要为不同的需求寻找不同的框架。
Spring 5有哪些重要特性?
Spring 5是对Spring 4的重大改进。其中一些重要特点包括:
- 支持Java 8及更高版本,因此我们可以使用lambda表达式。
- 支持Java EE7和Servlet 4.0规范。
- 文件操作现在通过NIO 2流执行,如果你的应用程序进行大量文件处理,这是一个巨大的改进。
- 引入spring-jcl来简化日志记录,之前由于没有单一的日志记录点,日志记录是一团糟。
- 支持Kotlin、Lombok、Reactor 3.1 Flux和Mono以及RxJava。
- Spring WebFlux将响应式编程引入Spring。
- 支持JUnit 5
- 支持通过索引文件”META-INF/spring.components”而非类路径扫描来提供Spring组件信息。
请阅读Spring 5的特点,以便详细了解这个版本。
5. 什么是Spring WebFlux?
Spring WebFlux是Spring 5中引入的新模块。Spring WebFlux是在Spring框架中采用响应式编程模型的第一步。
Spring WebFlux是Spring MVC模块的替代方案。Spring WebFlux用于基于事件循环执行模型创建全异步和非阻塞的应用程序。
你可以在Spring WebFlux教程上阅读更多相关信息。
6. 对于”依赖注入”,你了解是指什么?
依赖注入设计模式允许我们将硬编码的依赖关系移除,使我们的应用程序松耦合、可扩展和可维护。我们可以通过实现依赖注入模式,将依赖解析从编译时转移到运行时。
使用依赖注入的一些好处包括关注点分离、减少样板代码、可配置的组件和方便的单元测试。
请在”依赖注入教程”中阅读更多内容。我们还可以使用Google Guice来自动化依赖注入的过程。但在大多数情况下,我们需要的不仅仅是依赖注入,这就是Spring在顶级的原因所在。
7. 在Spring框架中,我们如何实现依赖注入?
我们可以使用基于Spring XML和基于注解的配置来实现Spring应用程序中的依赖注入。为了更好地理解,请阅读Spring依赖注入示例,您可以学习使用JUnit测试用例的两种方式。该文章还包含一个可下载和测试的示例项目压缩文件,以便您更深入地学习。
使用Spring Tool Suite有什么好处?
我们可以在Eclipse中安装插件来获取Spring Tool Suite的所有功能。然而,STS与Eclipse捆绑安装了其他重要组件,例如Maven支持、用于创建不同类型的Spring项目的模板,以及用于提高Spring应用性能的tc服务器。
我喜欢STS,因为它突出显示了Spring组件,如果你正在使用AOP切点和通知,它会清楚地显示哪些方法将属于特定的切点。所以与其自己安装所有东西,我更喜欢在开发基于Spring的应用时使用STS。
9. 列举一些重要的Spring模块。
Spring框架的一些重要模块包括:
- Spring Context – 用于依赖注入。
- Spring AOP – 用于面向切面编程。
- Spring DAO – 用于使用DAO模式进行数据库操作
- Spring JDBC – 用于JDBC和DataSource支持。
- Spring ORM – 用于ORM工具支持,如Hibernate
- Spring Web模块 – 用于创建Web应用程序。
- Spring MVC – 用于创建Web应用程序、Web服务等模型-视图-控制器实现。
10. 面向切面的编程是什么意思?
企业应用程序具有一些常见的横切关注点,适用于不同类型的对象和应用程序模块,例如日志记录、事务管理、数据验证、身份验证等等。面向对象编程中通过类实现应用程序的模块化。在AOP中,应用程序的模块化通过切面实现,并且它们被配置为跨越不同的类方法。
AOP 在正常的面向对象编程中消除了与横切任务相关的直接依赖关系。例如,我们可以为日志记录单独创建一个类,但其他类必须调用这些方法。但是,在 AOP 中,我们配置切面,并且方法执行会自动发生。在 Spring AOP 示例中阅读更多有关 Spring AOP 支持的信息。
11. 在AOP中,Aspect(切面)、Advice(通知)、Pointcut(切点)、JointPoint(连接点)和Advice Arguments(通知参数)分别指的是什么?
切面:切面是一个实现横切关注点(如事务管理)的类。切面可以是一个普通类,在Spring Bean配置文件中进行配置,也可以使用Spring AspectJ支持,通过@Aspect注解声明一个类为切面。
通知:通知是针对特定连接点所采取的行动。在编程方面,它们是在应用程序中达到具有匹配切入点的特定连接点时执行的方法。您可以将通知视为Spring拦截器或Servlet过滤器。
切点:切点是与连接点进行匹配的正则表达式,用于确定是否需要执行通知。切点使用不同类型的表达式与连接点进行匹配。Spring框架使用AspectJ切点表达式语言来确定应用通知方法的连接点。
连接点:连接点是应用程序中的特定点,例如方法执行、异常处理、更改对象变量值等等。在Spring AOP中,连接点始终是方法的执行。
通知参数:我们可以在通知方法中传递参数。我们可以在切入点中使用args()表达式,以适用于匹配参数模式的任何方法。如果我们使用这个方法,那么我们需要在通知方法中使用相同的名称,从中确定参数类型。
这些概念起初似乎令人困惑,但如果你仔细学习Spring切面,以及其中的通知示例,你就能轻松理解它们。
12. Spring AOP 和 AspectJ AOP 有何不同之处?
AspectJ 是面向切面编程的行业标准实现,而Spring 在某些情况下实现了AOP。Spring AOP 和 AspectJ 的主要区别是:
- Spring AOP比AspectJ更易于使用,因为我们不需要担心织入过程。
- Spring AOP支持AspectJ注解,所以如果你熟悉AspectJ,那么使用Spring AOP会更容易。
- Spring AOP只支持基于代理的AOP,因此它只能应用于方法执行的连接点。AspectJ支持所有类型的切点。
- Spring AOP的一个缺点是它只能应用于通过Spring Context创建的bean。
13. Spring IoC容器是什么?
控制反转(IoC)是实现对象依赖之间松耦合的机制。为了实现运行时对象的松耦合和动态绑定,对象定义了它们的依赖关系,这些依赖关系由其他装配对象进行注入。Spring IoC容器是将依赖注入到对象并使其为我们使用准备就绪的程序。
Spring框架的IoC容器类属于org.springframework.beans和org.springframework.context包,为我们提供了不同的方法来解耦对象的依赖关系。
我们使用的一些有用的ApplicationContext实现包括:
- AnnotationConfigApplicationContext: 用于使用基于注解配置的独立Java应用程序。
- ClassPathXmlApplicationContext: 用于使用基于XML配置的独立Java应用程序。
- FileSystemXmlApplicationContext: 与ClassPathXmlApplicationContext类似,不同之处在于XML配置文件可以从文件系统的任何位置加载。
- AnnotationConfigWebApplicationContext和XmlWebApplicationContext用于Web应用程序。
14. 什么是Spring Bean?
通过Spring IoC容器初始化的任何常规的Java类被称为Spring Bean。我们使用Spring ApplicationContext来获取Spring Bean实例。
Spring IoC容器管理Spring Bean的生命周期、Bean的作用域以及在Bean中注入所需的依赖关系。
15. Spring Bean 配置文件的重要性是什么?
我们使用Spring Bean配置文件来定义所有将由Spring Context初始化的bean。当我们创建Spring ApplicationContext的实例时,它会读取Spring bean XML文件并初始化所有的bean。一旦上下文被初始化,我们可以使用它来获取不同的bean实例。
除了Spring Bean配置外,这个文件还包含Spring MVC拦截器、视图解析器和其他支持基于注解的配置的元素。
16. 配置一个类作为Spring Bean的不同方式有哪些?
配置Spring Bean有三种不同的方式。
XML配置:这是最流行的配置方式,我们可以在上下文文件中使用bean元素来配置一个Spring Bean。例如:
<bean name="myBean" class="com.Olivia.spring.beans.MyBean"></bean>
基于Java的配置: 如果您仅使用注解,则可以使用@Bean注解配置一个Spring bean。此注解与@Configuration类一起用于配置Spring bean。样本配置如下:
@Configuration
@ComponentScan(value="com.Olivia.spring.main")
public class MyConfiguration {
@Bean
public MyService getService(){
return new MyService();
}
}
要从spring上下文获取这个bean,我们必须使用以下代码片段:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
MyConfiguration.class);
MyService service = ctx.getBean(MyService.class);
基于注解的配置:我们还可以使用@Component,@Service,@Repository和@Controller注解来配置类,使其成为Spring Bean。对于这些类,我们需要提供要扫描的基本包位置。例如:
<context:component-scan base-package="com.Olivia.spring" />
17. Spring Bean有哪些不同的作用范围?
Spring Beans 定义了五个作用域。
- 单例:每个容器只会创建一个bean实例。这是spring beans的默认范围。当使用此范围时,请确保spring bean没有共享的实例变量,否则可能会导致数据不一致问题,因为它不是线程安全的。
原型:每次请求bean时都会创建一个新的实例。
请求:与原型范围相同,但是旨在用于Web应用程序。每个HTTP请求都会创建一个bean的新实例。
会话:容器会为每个HTTP会话创建一个新的bean。
全局会话:用于创建Portlet应用程序的全局会话bean。
Spring Framework 是可扩展的,我们也可以创建自己的作用域。但大部分情况下,使用框架提供的作用域就足够了。为了设置 Spring Bean 的作用域,我们可以在 bean 元素中使用“scope”属性或者在注解式配置中使用 @Scope 注解。
18. Spring Bean的生命周期是怎样的?
Spring的Bean由Spring容器进行初始化,并且所有依赖项也被注入。当上下文被销毁时,它还会销毁所有已初始化的Bean。这在大多数情况下都很有效,但有时我们希望在使我们的Bean准备好使用之前初始化其他资源或进行一些验证。Spring框架提供了对Spring Bean的后初始化和预销毁方法的支持。
我们可以通过实现InitializingBean和DisposableBean接口,或者在Spring bean配置中使用init-method和destroy-method属性来实现这个功能。更多细节,请阅读Spring Bean生命周期方法。
19. 如何在Spring Bean中获取ServletContext和ServletConfig对象?
在Spring Bean中获取容器特定对象有两种方法。
- Implementing Spring *Aware interfaces, for these ServletContextAware and ServletConfigAware interfaces, for a complete example of these aware interfaces, please read Spring Aware Interfaces.
- Using @Autowired annotation with bean variable of type ServletContext and ServletConfig. They will work only in servlet container-specific environments only.
@Autowired
ServletContext servletContext;
20. Bean注入和@Autowired注解是什么?
在初始化期间注入Spring Bean依赖的过程称为Spring Bean Wiring。
通常来说,最佳做法是对所有的bean依赖进行显式的装配,但是Spring框架也支持自动装配。我们可以使用`@Autowired`注解,在字段或方法上使用byType的方式进行自动装配。为了让这个注解工作,我们还需要在Spring的bean配置文件中启用基于注解的配置。可以通过添加`
有关@Autowired注释的更多详细信息,请阅读Spring Autowire示例。
21. Spring Bean自动装配有哪些不同类型?
在Spring框架中有四种自动装配的类型。
- 按名称自动装配
按类型自动装配
通过构造函数自动装配
通过@Autowired和@Qualifier注释自动装配
在Spring 3.1之前,支持通过自动检测的方式进行自动连接,类似于通过构造函数或按类型自动连接的方式。有关这些选项的更多详细信息,请阅读Spring Bean自动连接。
22. 春天的豆子是否提供线程安全性?
Spring bean的默认作用范围是单例的,这意味着每个上下文只会有一个实例。这也意味着,如果一个类级别的变量可以被任意线程更新,会导致数据不一致。因此,在默认模式下,Spring beans不是线程安全的。
然而,我们可以将Spring Bean的范围更改为请求、原型或会话,以达到线程安全的目的,但这会牺牲性能。这是一个设计决策,取决于项目的要求。
23. 在Spring MVC中,控制器(Controller)是什么?
就像MVC设计模式一样,控制器是负责处理所有客户请求并将其发送到配置的资源进行处理的类。在Spring MVC中,DispatcherServlet是前端控制器类,根据spring bean的配置初始化上下文。
一个控制器类负责根据请求映射处理不同类型的客户请求。我们可以使用@Controller注释来创建控制器类。通常情况下,它与@RequestMapping注释一起使用,为特定的URI映射定义处理程序方法。
在Spring中,@Component、@Controller、@Repository和@Service注解有什么区别?
@Component的作用是表示一个类是一个组件。当使用基于注解的配置时,这些类用于自动检测并配置为一个bean。
@Controller 是MVC应用程序中的特定组件类型,主要与RequestMapping注释一起使用。
@Repository注解用于指示一个组件被用作仓库,并用于存储、检索、搜索数据的机制。我们可以将此注解应用于DAO模式的实现类中。
@Service是用来表示一个类是一个服务的。通常,提供一些服务的业务外观类都会被注释为@Service。
我们可以使用上述任何一种注解进行自动检测,但是提供了不同类型的注解以便你可以轻松区分注解类的用途。
25. DispatcherServlet和ContextLoaderListener是什么?
DispatcherServlet 是 Spring MVC 应用程序中的前端控制器,它加载 spring bean 配置文件,并初始化所有已配置的 bean。如果启用了注释扫描,则还会扫描包并配置所有带有 @Component、@Controller、@Repository 或 @Service 注释的 bean。
ContextLoaderListener是启动和关闭Spring根WebApplicationContext的监听器。它的重要功能是将ApplicationContext的生命周期与ServletContext的生命周期绑定在一起,并自动创建ApplicationContext。我们可以使用它来定义可以在不同Spring上下文中共享的bean。
26. 在Spring中,ViewResolver是什么?
视图解析器的实现是用来根据名称解析视图页面的。我们在Spring bean配置文件中进行配置。例如:
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
InternalResourceViewResolver是ViewResolver接口的一种实现,我们通过bean属性提供视图页面的目录和后缀位置。因此,如果一个控制器处理方法返回“home”,视图解析器将使用位于/WEB-INF/views/home.jsp的视图页面。
27. MultipartResolver 是什么,什么时候会用到它?
MultipartResolver接口用于上传文件 – CommonsMultipartResolver和StandardServletMultipartResolver是Spring框架提供的两种用于文件上传的实现。默认情况下,没有配置多部分解析器,但要使用它们上传文件,我们只需要在Spring Bean配置中定义一个名为“multipartResolver”的类型为MultipartResolver的bean。
一旦配置完成,任何多部分请求将由配置的MultipartResolver解析,并传递给包装后的HttpServletRequest。然后,在控制器类中使用它来获取文件并进行处理。有关一个完整的示例,请阅读Spring MVC文件上传示例。
28. 如何在Spring MVC框架中处理异常?
Spring MVC框架提供了以下方法,以帮助我们实现强大的异常处理。
控制器为基础 – 我们可以在控制器类中定义异常处理器方法。我们只需要在这些方法上注解@ExceptionHandler。
全局异常处理程序 – 异常处理是一个横切关注点,Spring提供了@ControllerAdvice注解,我们可以与任何类一起使用来定义全局异常处理程序。
HandlerExceptionResolver实现-对于常见的异常,大部分时间我们会提供静态页面。Spring框架提供了HandlerExceptionResolver接口,我们可以实现它来创建一个全局异常处理器。之所以提供这种额外的定义全局异常处理器的方式,是因为Spring框架还提供了默认的实现类,我们可以在spring bean配置文件中定义,以获得Spring框架的异常处理效果。
请阅读Spring异常处理示例以获取完整的示例。
29. 在Java程序中如何创建ApplicationContext?
在独立的Java程序中,有以下几种方法可以创建Spring上下文。
- AnnotationConfigApplicationContext: 如果我们在独立的Java应用程序中使用Spring,并且使用注解进行配置,那么我们可以使用该类来初始化容器并获取bean对象。
ClassPathXmlApplicationContext: 如果我们在独立应用程序中有一个Spring bean配置XML文件,我们可以使用该类来加载文件并获取容器对象。
FileSystemXmlApplicationContext: 这个类与ClassPathXmlApplicationContext类似,只是可以从文件系统中的任何位置加载XML配置文件。
30. 我们可以有多个Spring配置文件吗?
对于Spring MVC应用程序,我们可以通过contextConfigLocation定义多个Spring上下文配置文件。这个位置字符串可以由多个位置组成,用任意数量的逗号和空格分隔。例如;
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml,/WEB-INF/spring/appServlet/servlet-jdbc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
我们还可以定义多个根级别的Spring配置,并通过context-param来加载它。例如:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml /WEB-INF/spring/root-security.xml</param-value>
</context-param>
另一种选择是在上下文配置文件中使用import元素来导入其他配置,例如:
<beans:import resource="spring-jdbc.xml"/>
31. ContextLoaderListener是什么?
ContextLoaderListener是用于加载根上下文并定义Spring Bean配置的监听器类,这些配置将对所有其他上下文可见。它在web.xml文件中进行配置。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
创建一个Spring MVC应用所需的最小配置是什么?
要创建一个简单的Spring MVC应用程序,我们需要完成以下任务。
- 在项目中添加spring-context和spring-webmvc依赖。
- 在web.xml文件中配置DispatcherServlet,以便通过spring容器处理请求。
- Spring bean配置文件用于定义bean,如果使用注解,则必须在此处进行配置。此外,我们还需要为视图页面配置视图解析器。
- 定义了请求映射的Controller类,用于处理客户端请求。
以上步骤应该足够创建一个简单的Spring MVC Hello World应用程序。
你如何将Spring MVC框架与MVC架构关联起来?
正如其名,Spring MVC是建立在Model-View-Controller架构之上的。DispatcherServlet是Spring MVC应用程序中的前端控制器,负责处理所有传入的请求,并将它们委派给不同的控制器处理方法。
在Spring框架中,模型可以是任何Java Bean,就像其他MVC框架一样,Spring还提供了将表单数据自动绑定到Java Bean的功能。我们可以将模型Bean设置为视图页面中使用的属性。
视图页面可以是JSP、静态HTML等,视图解析器负责找到正确的视图页面。一旦确定视图页面,控制权会交给DispatcherServlet控制器。DispatcherServlet负责渲染视图并将最终响应返回给客户端。
如何在Spring MVC应用程序中实现本地化?
Spring通过资源包为本地化或国际化(i18n)提供了出色的支持。使我们的应用程序本地化所需的基本步骤是:
- 为不同地区创建消息资源包,例如 messages_en.properties、messages_fr.properties 等。
- 在Spring Bean配置文件中定义messageSource Bean,类型为ResourceBundleMessageSource或ReloadableResourceBundleMessageSource。
- 为支持地区切换,定义类型为CookieLocaleResolver的localeResolver Bean,并配置LocaleChangeInterceptor拦截器。示例配置如下:
<beans:bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basename" value="classpath:messages" />
<beans:property name="defaultEncoding" value="UTF-8" />
</beans:bean>
<beans:bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<beans:property name="defaultLocale" value="en" />
<beans:property name="cookieName" value="myAppLocaleCookie"></beans:property>
<beans:property name="cookieMaxAge" value="3600"></beans:property>
</beans:bean>
<interceptors>
<beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="locale" />
</beans:bean>
</interceptors>
- 在视图页面中使用spring:message元素并指定键名,DispatcherServlet会选取对应的值,以相应的地区语言渲染页面并作为响应返回。
请阅读《Spring本地化示例》以获得完整的示例。
我们如何使用Spring来创建返回JSON响应的Restful Web服务?
我们可以使用Spring框架来创建返回JSON数据的Restful web服务。Spring提供了与Jackson JSON API的集成,我们可以使用它来在restful web服务中发送JSON响应。
配置我们的Spring MVC应用程序以发送JSON响应,需要执行以下步骤:
如果你使用Maven,可以通过以下代码添加Jackson JSON依赖项。
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.databind-version}</version>
</dependency>
在Spring的bean配置文件中配置RequestMappingHandlerAdapter bean,并将message converters属性设置为MappingJackson2HttpMessageConverter bean。示例配置如下:
<!-- 配置方法处理器中的JSON请求和响应插件 -->
<beans:bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="jsonMessageConverter"/>
</beans:list>
</beans:property>
</beans:bean>
<!-- 配置用于JSON和POJO相互转换的Bean -->
<beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</beans:bean>
在控制器处理方法中,使用@ResponseBody注解将对象作为响应返回。示例代码:
@RequestMapping(value = EmpRestURIConstants.GET_EMP, method = RequestMethod.GET)
public @ResponseBody Employee getEmployee(@PathVariable("id") int empId) {
logger.info("Start getEmployee. ID="+empId);
return empData.get(empId);
}
4. 你可以通过任何API调用REST服务,但如果你想使用Spring,那么你可以轻松地使用RestTemplate类。
请阅读《Spring Restful Web服务示例》以查看一个完整的示例。
36. 你使用过哪些重要的Spring注解?
在我的项目中,我使用了一些Spring注解。
- @Controller – 用于Spring MVC项目中的控制器类。
- @RequestMapping – 用于配置控制器处理程序方法中的URI映射。这是一个非常重要的注解,所以你应该学习Spring MVC RequestMapping注解示例。
- @ResponseBody – 用于将对象作为响应发送,通常用于发送XML或JSON数据作为响应。
- @PathVariable – 用于将URI中的动态值映射到处理程序方法参数。
- @Autowired – 用于在Spring bean中自动装配依赖项。
- @Qualifier – 与@Autowired注解一起使用,以避免存在多个相同类型bean实例时的混淆。
- @Service – 用于服务类。
- @Scope – 用于配置Spring bean的作用域。
- @Configuration、@ComponentScan和@Bean – 用于基于Java的配置。
- 用于配置切面和通知的AspectJ注解,如@Aspect、@Before、@After、@Around、@Pointcut等。
37. 控制器处理程序方法的响应中可以发送一个对象吗?
是的,我们可以使用@ResponseBody注解完成。这是在RESTful Web服务中发送JSON或XML响应的方法。
38. 在Spring MVC应用程序中如何上传文件?
Spring提供了通过MultipartResolver接口实现文件上传的内置支持。使用起来非常简单,只需要进行配置更改就可以使其工作。我们需要编写控制器处理程序方法来处理传入的文件并进行处理。有关完整的示例,请参考Spring文件上传示例。
39. 在Spring Web MVC框架中如何验证表单数据?
Spring支持基于JSR-303注解的验证,同时还提供了一个Validator接口,我们可以实现它来创建自定义的验证器。使用基于JSR-303的验证时,我们需要用所需的验证注解标记Bean变量。
对于自定义验证器的实现,我们需要在控制器类中进行配置。完整示例,请参阅Spring MVC表单验证示例。
40. 什么是Spring MVC拦截器以及如何使用它?
Spring MVC拦截器类似于Servlet过滤器,可以拦截并处理客户端请求。我们可以在三个位置拦截客户端请求——preHandle、postHandle和afterCompletion。
我们可以通过实现HandlerInterceptor接口或者继承抽象类HandlerInterceptorAdapter来创建一个Spring拦截器。
我们需要在Spring Bean配置文件中配置拦截器。我们可以定义一个拦截器来拦截所有客户端的请求,也可以为特定的URI映射配置拦截器。更详细的例子,请参考Spring MVC拦截器示例。
41. Spring JdbcTemplate类是什么,以及如何使用它?
Spring框架与JDBC API的集成非常出色,并提供了JdbcTemplate实用类,我们可以使用它来避免数据库操作逻辑中的样板代码,如打开/关闭连接、ResultSet、PreparedStatement等。
请参考Spring JDBC示例中的JdbcTemplate示例。
42. 在Spring Web应用程序中如何使用Tomcat JNDI DataSource?
要使用配置了JNDI数据源的Servlet容器,我们需要在Spring的bean配置文件中进行配置,并将其注入到Spring bean作为依赖项。然后我们可以使用JdbcTemplate来执行数据库操作。
<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>
请参考Spring Tomcat JNDI示例获取完整示例。
43. 如何在Spring中实现事务管理?
Spring框架提供了通过声明式事务管理和编程式事务管理来支持事务管理。声明式事务管理被广泛使用,因为它易于使用且在大多数情况下都有效。
我们在声明式事务管理中使用@Transactional注解来注释一个方法。我们需要在Spring Bean配置文件中配置DataSource的事务管理器。
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
44. Spring DAO是什么?
Spring提供了对于数据访问技术(如JDBC和Hibernate)的支持,以一种一致且简便的方式进行操作。例如,我们有JdbcDaoSupport、HibernateDaoSupport、JdoDaoSupport和JpaDaoSupport来分别支持这些技术。
Spring DAO还提供了异常层次结构的一致性,并且我们不需要捕获具体的异常。
45. 如何整合Spring和Hibernate框架?
如果你在使用Hibernate 3+,我们可以使用Spring ORM模块来集成Spring和Hibernate框架。在这种情况下,SessionFactory提供了当前会话,所以你应该避免使用HibernateTemplate或HibernateDaoSupport类,最好使用DAO模式与依赖注入进行集成。
Spring ORM提供支持使用Spring声明式事务管理,因此你应该利用它,而不是使用Hibernate样板代码来进行事务管理。
为了更好地理解,你应该阅读以下教程:
- Spring Hibernate集成示例
- Spring MVC Hibernate集成示例
46. Spring Security是什么?
Spring安全框架致力于为Java应用程序提供身份验证和授权功能。它还能够解决大部分常见的安全漏洞问题,如CSRF攻击。
在Web应用程序中使用Spring Security非常有益且易于使用,通过使用@EnableWebSecurity等注解。您应该阅读以下文章以了解如何使用Spring Security框架。
- Servlet Web应用程序中的Spring Security
- Spring MVC和Spring Security集成示例
如何将java.util.Properties注入到Spring Bean中?
我们需要定义一个propertyConfigurer bean来从给定的属性文件中加载属性。然后,我们可以使用Spring EL支持来将属性注入到其他bean的依赖关系中。例如:
<bean id="propertyConfigurer"
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="location" value="/WEB-INF/application.properties" />
</bean>
<bean class="com.Olivia.spring.EmployeeDaoImpl">
<property name="maxReadResults" value="${results.read.max}"/>
</bean>
如果您正在使用注解来配置Spring Bean,那么您可以通过以下方式注入属性。
@Value("${maxReadResults}")
private int maxReadResults;
48. 列举一些在Spring框架中使用的设计模式?
Spring Framework 在使用很多设计模式,其中一些常见的有:
- 单例模式:使用默认范围创建 bean。
- 工厂模式:Bean 工厂类。
- 原型模式:Bean 范围。
- 适配器模式:Spring Web 和 Spring MVC。
- 代理模式:Spring 面向切面编程支持。
- 模板方法模式:JdbcTemplate、HibernateTemplate 等。
- 前端控制器:Spring MVC DispatcherServlet。
- 数据访问对象:Spring DAO 支持。
- 依赖注入和面向切面编程。
对于Spring Framework,有哪些最佳实践?
Spring框架的一些最佳实践包括:
- 在模式引用中避免使用版本号,以确保我们使用最新的配置。
- 根据关注点划分Spring Bean配置,例如spring-jdbc.xml、spring-security.xml。
- 对于在Spring MVC中多个上下文中使用的Spring Bean,在根上下文中创建它们并使用监听器进行初始化。
- 尽可能配置Bean依赖关系,尽量避免自动装配。
- 对于应用程序级别的属性,最佳方法是创建属性文件并在Spring Bean配置文件中读取它。
- 对于小型应用程序,注解很有用,但对于大型应用程序,注解可能会变得麻烦。如果我们将所有配置都放在XML文件中,维护起来会更容易。
- 为组件使用正确的注解以便于理解其用途。对于服务使用@Service,对于DAO Bean使用@Repository。
- Spring框架有很多模块,只使用你需要的。删除通过Spring Tool Suite模板创建项目时通常添加的所有额外依赖项。
- 如果使用切面,确保保持连接点尽可能窄,以避免对不需要的方法进行通知。考虑使用自定义注解,它们更易于使用并避免任何问题。
- 当有实际好处时使用依赖注入,不要仅仅为了松耦合而使用它,因为它更难维护。
50. Spring Boot是什么?
Spring Boot使得Spring框架变得独特。它为我们提供了一种简单的方式来创建不同类型的Java应用程序并将它们与Servlet容器运行环境关联起来。因此,我们得到了一个可以运行该项目的单个JAR文件。这样,我们在非常短的时间内就能得到一个准备好部署的骨架项目,节省了很多时间。这样,我们就能更专注于业务逻辑,而不是经历构建代码、然后在Servlet容器上部署的常规流程。鉴于这是一个非常广泛的话题,我建议您参阅Spring Boot面试问题。
以上就是Spring Framework面试问题的全部内容。我希望这些问题能够在你即将进行的Java EE面试中帮助到你。我会继续添加更多问题到列表中,只要我找到它们。如果你知道还有其他应该包含在列表中的问题,请务必在评论中添加,我会加入其中。