Spring面试问题与解答
我最近发布了很多Spring教程,这篇文章将帮助您了解Spring面试详细解释核心概念的问题。
Spring Framework是Web应用程序最流行的Java EE框架之一。依赖注入和面向方面编程是Spring框架的核心。如果你擅长Spring Framework,那么获得选择的机会就会很高。
你应该将这篇文章加入书签,因为Spring Framework要大得多,我很可能会继续在这个列表中添加更多问题,你不想错过它们。
专业提示:核心Java是任何基于Java的框架的基础,因此如果您正在准备面试,请参阅Core Java面试问题和Java面试问题文章。
Spring 面试问题
- 什么是Spring Framework?
- Spring Framework的一些重要特性和优势是什么?
- 你对依赖注入有什么了解?
- 我们如何在Spring Framework中实现DI?
- 使用Spring Tool Suite有什么好处?
- 列举一些重要的Spring模块?
- 面向方面编程你有什么理解?
- AOP中的Aspect,Advice,Pointcut,JointPoint和Advice Arguments是什么?
- Spring AOP和AspectJ AOP有什么区别?
- 什么是Spring IoC Container?
- 什么是Spring Bean?
- Spring bean配置文件的重要性是什么?
- 将类配置为Spring Bean有哪些不同的方法?
- Spring Bean有哪些不同的范围?
- 什么是Spring Bean生命周期?
- 如何在Spring Bean中获取ServletContext和ServletConfig对象?
- 什么是Bean接线和@Autowired注释?
- 什么是不同类型的Spring Bean自动装配?
- Spring Bean是否提供线程安全性?
- 什么是Spring MVC中的Controller?
- Spring中的@ Component,@ Repository和@Service注释有什么区别?
- 什么是DispatcherServlet和ContextLoaderListener?
- Spring中的ViewResolver是什么?
- 什么是MultipartResolver以及何时使用?
- 如何处理Spring MVC Framework中的异常?
- 如何在Java程序中创建ApplicationContext?
- 我们可以有多个Spring配置文件吗?
- 什么是ContextLoaderListener?
- 创建Spring MVC应用程序所需的最低配置是什么?
- 您如何将Spring MVC Framework与MVC架构联系起来?
- 如何在Spring MVC应用程序中实现本地化?
- 我们如何使用Spring创建Restful Web Service返回JSON响应?
- 您使用过的一些重要的Spring注释是什么?
- 我们可以发送一个Object作为Controller处理程序方法的响应吗?
- 如何在Spring MVC Application中上传文件?
- 如何在Spring Web MVC Framework中验证表单数据?
- 什么是Spring MVC Interceptor以及如何使用它?
- 什么是Spring JdbcTemplate类以及如何使用它?
- 如何在Spring Web应用程序中使用Tomcat JNDI DataSource?
- 您如何在Spring中实现事务管理?
- 什么是春天DAO?
- 如何集成Spring和Hibernate框架?
- 什么是Spring Security?
- 如何将java.util.Properties注入Spring Bean?
- 列举Spring Framework中使用的一些设计模式?
- Spring Framework有哪些最佳实践?
Spring面试问题与解答
-
什么是Spring Framework?
Spring是使用最广泛的Java EE框架之一。Spring框架核心概念是“依赖注入”和“面向方面编程”。 Spring框架也可以在普通的java应用程序中使用,通过实现依赖注入来实现不同组件之间的松散耦合. 我们可以使用spring支持面向方面编程来执行横切任务,例如日志记录和身份验证。 我喜欢spring,因为它为Spring MVC和Spring JDBC等特定任务提供了许多功能和不同的模块。 由于它是一个包含大量在线资源和活跃社区成员的开源框架,因此使用Spring框架既简单又有趣。
-
Spring Framework的一些重要特性和优势是什么?
Spring Framework构建于两个设计概念之上 - 依赖注入和面向方面编程。
spring框架的一些特性是:
- 使用框架进行开发的轻量级和非常小的开销。
- 依赖注入或控制反转来编写彼此独立的组件,弹簧容器负责将它们连接在一起以实现我们的工作。
- Spring IoC容器管理Spring Bean生命周期和项目特定配置,例如JNDI查找。
- Spring MVC框架可用于创建Web应用程序以及能够返回XML和JSON响应的restful Web服务。
- 通过使用注释或spring bean配置文件,支持事务管理,JDBC操作,文件上载,异常处理等,只需很少的配置。
使用Spring Framework的一些优点是:
- 减少应用程序的不同组件之间的直接依赖关系,通常Spring IoC容器负责初始化资源或bean并将它们作为依赖项注入。
- 在Spring框架中编写单元测试用例很容易,因为我们的业务逻辑与实际的资源实现类没有直接的依赖关系。我们可以轻松编写测试配置并注入我们的模拟bean用于测试目的。
- 减少锅炉板代码的数量,例如初始化对象,打开/关闭资源。我非常喜欢JdbcTemplate类,因为它有助于我们删除JDBC编程附带的所有样板代码。
- Spring框架分为几个模块,它有助于我们保持应用程序的轻量级。例如,如果我们不需要Spring事务管理功能,我们就不需要在项目中添加该依赖项。
- Spring框架支持大多数Java EE功能甚至更多功能。它总是在新技术之上,例如,有一个Android的Spring项目可以帮助我们为原生Android应用程序编写更好的代码。这使得spring框架成为一个完整的包,我们不需要为不同的需求来管理不同的框架。
-
你对依赖注入有什么了解?
依赖注入设计模式允许我们删除硬编码的依赖项,并使我们的应用程序松散耦合,可扩展和可维护。我们可以实现依赖注入模式,将依赖关系解析从编译时移动到运行时。
使用依赖注入的一些好处是关注点分离,Boilerplate代码减少,可配置组件和简单的单元测试。
阅读更多依赖注入教程。我们还可以使用Google Guice for Dependency Injection来自动执行依赖注入过程。但在大多数情况下,我们寻求的不仅仅是依赖注入,这就是为什么Spring是最佳选择。
-
我们如何在Spring Framework中实现DI?
我们可以使用基于Spring XML和基于Annotation的配置来在spring应用程序中实现DI。为了更好地理解,请阅读Spring Dependency Injection示例,您可以在其中学习JUnit测试用例的两种方法。该帖子还包含示例项目zip文件,您可以下载和播放以了解更多信息。
-
使用Spring Tool Suite有什么好处?
我们可以在Eclipse中安装插件以获得Spring Tool Suite的所有功能。但是,STS带有一些其他重要的东西,如Maven支持,用于创建不同类型的Spring项目的模板和用于Spring应用程序的更好性能的tc服务器。
我喜欢STS,因为它突出了Spring组件,如果你使用的是AOP切入点和建议,那么它会清楚地显示特定切入点下的哪些方法。因此,我宁愿在开发基于Spring的应用程序时使用STS,而不是自己安装所有内容。
-
列举一些重要的Spring模块?
一些重要的Spring Framework模块是:
- Spring Context - 用于依赖注入。
- Spring AOP - 面向方面编程。
- Spring DAO - 用于使用DAO模式的数据库操作
- Spring JDBC - 用于JDBC和DataSource支持。
- Spring ORM - 用于支持Hibernate等ORM工具
- Spring Web Module - 用于创建Web应用程序。
- Spring MVC - 用于创建Web应用程序,Web服务等的Model-View-Controller实现。
-
面向方面编程你有什么理解?
企业应用程序有一些常见的横切关注点,适用于不同类型的对象和应用程序模块,如日志记录,事务管理,数据验证,身份验证等。在面向对象编程中,应用程序的模块化是通过类实现的,而在AOP应用程序中模块化由Aspects实现,它们被配置为跨越不同的类方法。
AOP从正常的面向对象编程中不可能的类中获取横切任务的直接依赖性。例如,我们可以有一个单独的日志记录类,但类再次调用这些方法来记录数据。在Spring AOP上阅读有关Spring AOP支持的更多信息。
-
AOP中的Aspect,Advice,Pointcut,JointPoint和Advice Arguments是什么?
方面:Aspect是一个实现交叉问题的类,例如事务管理。方面可以是配置的普通类,然后在Spring Bean配置文件中配置,或者我们可以使用Spring AspectJ支持使用
@Aspect
注释将类声明为Aspect 。建议:建议是针对特定连接点采取的操作。在编程方面,它们是在应用程序中达到具有匹配切入点的特定连接点时执行的方法。您可以将Advices视为Spring拦截器或Servlet过滤器。
切入点:切入点是与连接点匹配的正则表达式,用于确定是否需要执行建议。Pointcut使用与连接点匹配的不同类型的表达式。Spring框架使用AspectJ切入点表达式语言来确定将应用通知方法的连接点。
连接点:连接点是应用程序中的特定点,例如方法执行,异常处理,更改对象变量值等。在Spring AOP中,连接点始终是方法的执行。
建议参数:我们可以在通知方法中传递参数。我们可以在切入点中使用args()表达式来应用于与参数模式匹配的任何方法。如果我们使用它,那么我们需要在确定参数类型的advice方法中使用相同的名称。
这些概念最初看起来很混乱,但是如果您通过Spring Aspect,Advice Example,那么您可以轻松地与它们相关联。
-
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。
-
什么是Spring IoC Container?
控制反转(IoC)是实现对象依赖关系之间松散耦合的机制。为了在运行时实现对象的松耦合和动态绑定,对象定义了由其他汇编器对象注入的依赖关系。Spring IoC容器是将依赖项注入对象并使其可供我们使用的程序。
Spring Framework IoC容器类是包的一部分,
org.springframework.beans
并org.springframework.context
为我们提供了解耦对象依赖关系的不同方法。我们使用的一些有用的ApplicationContext实现是;
AnnotationConfigApplicationContext
:对于使用基于注释的配置的独立Java应用程序。ClassPathXmlApplicationContext
:对于使用基于XML的配置的独立Java应用程序。FileSystemXmlApplicationContext
:类似于ClassPathXmlApplicationContext,但xml配置文件可以从文件系统中的任何位置加载。AnnotationConfigWebApplicationContext
和XmlWebApplicationContext
Web应用程序。
-
什么是Spring Bean?
由Spring IoC容器初始化的任何普通java类都称为Spring Bean。我们使用Spring
ApplicationContext
来获取Spring Bean实例。Spring IoC容器管理Spring Bean的生命周期,bean作用域以及在bean中注入任何所需的依赖项。
-
Spring bean配置文件的重要性是什么?
我们使用Spring Bean配置文件来定义将由Spring Context初始化的所有bean。当我们创建Spring ApplicationContext的实例时,它会读取spring bean XML文件并初始化所有这些文件。初始化上下文后,我们可以使用它来获取不同的bean实例。
除了Spring Bean配置外,该文件还包含spring MVC拦截器,视图解析器和其他元素,以支持基于注释的配置。
-
将类配置为Spring Bean有哪些不同的方法?
配置Spring Bean有三种不同的方法。
- XML配置:这是最流行的配置,我们可以在上下文文件中使用bean元素来配置Spring Bean。例如:
<bean name="myBean" class="com.journaldev.spring.beans.MyBean"></bean>
- 基于Java的配置:如果仅使用注释,则可以使用
@Bean
注释配置Spring bean 。此批注与@Configuration
类一起用于配置spring bean。示例配置是:@Configuration @ComponentScan(value="com.journaldev.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.journaldev.spring" />
- XML配置:这是最流行的配置,我们可以在上下文文件中使用bean元素来配置Spring Bean。例如:
-
Spring Bean有哪些不同的范围?
为Spring Beans定义了五个范围。
- singleton:只为每个容器创建一个bean实例。这是spring bean的默认范围。在使用此范围时,请确保spring bean没有共享实例变量,否则可能会导致数据不一致问题,因为它不是线程安全的。
- prototype:每次请求bean时都会创建一个新实例。
- 请求:这与原型范围相同,但它意味着用于Web应用程序。将为每个HTTP请求创建一个新的bean实例。
- session:将为容器的每个HTTP会话创建一个新bean。
- global-session:用于为Portlet应用程序创建全局会话bean。
Spring Framework是可扩展的,我们也可以创建自己的范围,但是大多数时候我们都很好地使用框架提供的范围。
要设置spring bean范围,我们可以在bean元素中使用“scope”属性,或者为基于注释的配置使用@Scope注释。
-
什么是Spring Bean生命周期?
Spring Bean初始化Spring Bean,并且还注入了所有依赖项。当上下文被销毁时,它也会破坏所有已初始化的bean。这在大多数情况下运行良好,但有时我们想要初始化其他资源或在使我们的bean准备好使用之前进行一些验证。Spring框架为spring bean中的post-initialization和pre-destroy方法提供支持。
我们可以通过两种方式实现这一点 - 通过实现
InitializingBean
和DisposableBean
接口或在spring bean配置中使用init-method和destroy-method属性。有关更多详细信息,请阅读Spring Bean生命周期方法。 -
如何在Spring Bean中获取ServletContext和ServletConfig对象?
有两种方法可以在spring bean中获取Container特定对象。
- 为这些ServletContextAware和ServletConfigAware接口实现Spring * Aware接口,以获取这些感知接口的完整示例,请阅读Spring Aware接口
- 使用
@Autowired
带有类型ServletContext
和的bean变量的注释ServletConfig
。它们仅适用于servlet容器特定环境。@Autowired ServletContext servletContext;
-
什么是Bean接线和@Autowired注释?
初始化时注入spring bean依赖项的过程称为Spring Bean Wiring。
通常,最佳做法是对所有bean依赖项进行显式连接,但spring框架也支持自动连接。我们可以使用
@Autowired
带有字段或方法的注释来自动装配byType。为了使这个注释起作用,我们还需要在spring bean配置文件中启用基于注释的配置。这可以通过context:annotation-config元素完成。有关
@Autowired
注释的更多详细信息,请阅读Spring Autowire示例。 -
什么是不同类型的Spring Bean自动装配?
Spring框架中有四种类型的自动装配。
- autowire byName
- autowire byType
- 由构造函数自动装配
- @Autowired和@Qualifier注释自动装配
在Spring 3.1之前,自动装配的自动检测也支持了相似的构造函数或byType的自动装配。有关这些选项的更多详细信息,请阅读Spring Bean Autowiring。
-
Spring Bean是否提供线程安全性?
Spring bean的默认范围是singleton,因此每个上下文只有一个实例。这意味着所有具有任何线程可以更新的类级别变量都将导致数据不一致。因此,在默认模式下,spring bean不是线程安全的。
但是,我们可以将spring bean范围更改为请求,原型或会话,以牺牲性能为代价来实现线程安全。这是一个设计决策,基于项目要求。
-
什么是Spring MVC中的Controller?
就像MVC设计模式一样,Controller是负责处理所有客户端请求并将它们发送到配置资源来处理它的类。在Spring MVC中,
org.springframework.web.servlet.DispatcherServlet
是前端控制器类,它基于spring bean配置初始化上下文。Controller类负责根据请求映射处理不同类型的客户端请求。我们可以使用
@Controller
注释创建一个控制器类。通常,它与@RequestMapping
注释一起用于定义特定URI映射的处理程序方法。 -
Spring中的@ Component,@ Controller,@ Repository和@Service注释有什么区别?
@Component用于表示类是一个组件。这些类用于自动检测,并在使用基于注释的配置时配置为bean。
@Controller是一种特定类型的组件,用于MVC应用程序,主要用于RequestMapping注释。
@Repository注释用于指示组件用作存储库以及存储/检索/搜索数据的机制。我们可以将此注释应用于DAO模式实现类。
@Service用于表示类是服务。通常,提供某些服务的业务门面类都使用此注释。
我们可以将上述任何注释用于自动检测的类,但提供了不同的类型,以便您可以轻松区分带注释的类的用途。
-
什么是DispatcherServlet和ContextLoaderListener?
DispatcherServlet
是Spring MVC应用程序中的前端控制器,它加载spring bean配置文件并初始化所有配置的bean。如果注释被启用,使其还可以扫描包和配置带注释的bean@Component
,@Controller
,@Repository
或@Service
注解。ContextLoaderListener
是启动和关闭Spring根的监听器WebApplicationContext
。它的重要功能是将生命周期ApplicationContext
与生命周期联系起来,ServletContext
并自动创建ApplicationContext
。我们可以使用它来定义可以在不同的spring上下文中使用的共享bean。 -
Spring中的ViewResolver是什么?
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的视图页面。 -
什么是MultipartResolver以及何时使用?
MultipartResolver
接口被用于上载文件-CommonsMultipartResolver
和StandardServletMultipartResolver
是由弹簧框架文件上载提供两个实现。默认情况下,没有配置多部件解析器但是要使用它们来上传文件,我们需要在spring bean配置中定义一个名为“multipartResolver”的bean,其类型为MultipartResolver。配置完成后,任何多部分请求都将由配置的MultipartResolver解析并传递一个包装好的HttpServletRequest。然后在控制器类中使用它来获取文件并对其进行处理。有关完整示例,请阅读Spring MVC文件上载示例。
-
如何处理Spring MVC Framework中的异常?
Spring MVC Framework提供了以下方法来帮助我们实现强大的异常处理。
- Controller Based - 我们可以在控制器类中定义异常处理程序方法。我们所需要的只是使用@ExceptionHandler注释来注释这些方法。
- 全局异常处理程序 - 异常处理是一个跨领域的问题,Spring提供了@ControllerAdvice批注,我们可以使用它来定义我们的全局异常处理程序。
- HandlerExceptionResolver实现 - 对于一般异常,大多数时候我们提供静态页面。Spring Framework提供
HandlerExceptionResolver
了我们可以实现的接口来创建全局异常处理程序。这种定义全局异常处理程序的额外方法背后的原因是Spring框架还提供了我们可以在spring bean配置文件中定义的默认实现类,以获得spring框架异常处理的好处。
有关完整示例,请阅读Spring异常处理示例。
-
如何在Java程序中创建ApplicationContext?
有以下方法可以在独立的Java程序中创建spring上下文。
- AnnotationConfigApplicationContext:如果我们在独立的Java应用程序中使用Spring并使用Configuration的注释,那么我们可以使用它来初始化容器并获取bean对象。
- ClassPathXmlApplicationContext:如果我们在独立应用程序中有spring bean配置xml文件,那么我们可以使用这个类来加载文件并获取容器对象。
- FileSystemXmlApplicationContext:这类似于ClassPathXmlApplicationContext,除了可以从文件系统中的任何位置加载xml配置文件。
-
我们可以有多个Spring配置文件吗?
对于Spring MVC应用程序,我们可以通过定义多个spring上下文配置文件
contextConfigLocation
。此位置字符串可以包含由任意数量的逗号和空格分隔的多个位置。例如;<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>
我们还可以定义多个根级弹簧配置并通过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"/>
-
什么是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
依赖项。 DispatcherServlet
在web.xml文件中配置以通过spring容器处理请求。- 用于定义bean的Spring bean配置文件,如果使用注释,则必须在此处进行配置。我们还需要为视图页面配置视图解析器。
- 控制器类,其中定义了请求映射以处理客户端请求。
- 在项目中添加
-
您如何将Spring MVC Framework与MVC架构联系起来?
顾名思义,Spring MVC建立在模型 - 视图 - 控制器架构之上。
DispatcherServlet
是Spring MVC应用程序中的Front Controller,负责处理所有传入的请求并将其委托给不同的控制器处理程序方法。该模型可以是Spring Framework中的任何Java Bean,就像任何其他MVC框架一样,Spring提供表单数据到java bean的自动绑定。我们可以将模型bean设置为要在视图页面中使用的属性。
查看页面可以是JSP,静态HTML等,视图解析器负责查找正确的视图页面。一旦识别出视图页面,就会将控制权返回给DispatcherServlet控制器。DispatcherServlet负责呈现视图并将最终响应返回给客户端。
-
如何在Spring MVC应用程序中实现本地化?
Spring通过资源包为本地化或i18n提供了出色的支持。使我们的应用程序本地化所需的基础步骤是:
- 为不同的语言环境创建消息资源包,例如messages_en.properties,messages_fr.properties等。
- 在类型
ResourceBundleMessageSource
或的spring bean配置文件中定义messageSource beanReloadableResourceBundleMessageSource
。 - 要更改语言环境支持,请定义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 Localization示例。
-
我们如何使用Spring创建Restful Web Service返回JSON响应?
我们可以使用Spring Framework创建返回JSON数据的Restful Web服务。Spring提供了与Jackson JSONAPI的集成,我们可以使用它来在宁静的Web服务中发送JSON响应。
我们需要执行以下步骤来配置Spring MVC应用程序以发送JSON响应:
- 添加Jackson JSON依赖项,如果您使用Maven,可以使用以下代码完成:
<!-- Jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.databind-version}</version> </dependency>
RequestMappingHandlerAdapter
在spring bean配置文件中配置bean,并将messageConverters属性设置为MappingJackson2HttpMessageConverter bean。示例配置将是:<!-- Configure to plugin JSON as request and response in method handler --> <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> <!-- Configure bean to convert JSON to POJO and vice versa --> <beans:bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> </beans:bean>
- 在控制器处理程序方法中,使用
@ResponseBody
注释将Object作为响应返回。示例代码:@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); }
- 您可以通过任何API调用其余服务,但是如果您想使用Spring,那么我们可以使用RestTemplate类轻松地完成它。
有关完整示例,请阅读Spring Restful Webservice示例。
- 添加Jackson JSON依赖项,如果您使用Maven,可以使用以下代码完成:
-
您使用过的一些重要的Spring注释是什么?
我在项目中使用的一些Spring注释是:
- @Controller - 用于Spring MVC项目中的控制器类。
- @RequestMapping - 用于在控制器处理程序方法中配置URI映射。这是一个非常重要的注释,因此您应该通过Spring MVC RequestMapping Annotation示例
- @ResponseBody - 用于发送Object作为响应,通常用于发送XML或JSON数据作为响应。
- @PathVariable - 用于将动态值从URI映射到处理程序方法参数。
- @Autowired - 用于在spring bean中自动连接依赖项。
- @Qualifier - 使用@Autowired注释,以避免在存在多个bean类型实例时出现混淆。
- @Service - 用于服务类。
- @Scope - 用于配置spring bean的范围。
- @Configuration,@ComponentScan和@Bean -基于Java的配置。
- AspectJ的注解配置方面和建议,@Aspect,@Before,@After,@Around,@Pointcut等。
-
我们可以发送一个Object作为Controller处理程序方法的响应吗?
是的,我们可以使用@ResponseBody注释。这就是我们在restful Web服务中发送基于JSON或XML的响应的方式。
-
如何在Spring MVC Application中上传文件?
Spring通过MultipartResolver接口实现为上传文件提供内置支持。它非常易于使用,只需要更改配置即可使其正常工作。显然,我们需要编写控制器处理程序方法来处理传入的文件并对其进行处理。有关完整示例,请参阅Spring File Upload Example。
-
如何在Spring Web MVC Framework中验证表单数据?
Spring支持基于JSR-303注释的验证,并提供我们可以实现的Validator接口来创建我们自己的自定义验证器。对于使用基于JSR-303的验证,我们需要使用所需的验证来注释bean变量。
对于自定义验证器实现,我们需要在控制器类中进行配置。有关完整示例,请阅读Spring MVC表单验证示例。
-
什么是Spring MVC Interceptor以及如何使用它?
Spring MVC拦截器就像Servlet过滤器,允许我们拦截客户端请求并处理它。我们可以在三个地方拦截客户请求 - preHandle,postHandle和afterCompletion。
我们可以通过实现HandlerInterceptor接口或扩展抽象类HandlerInterceptorAdapter来创建spring拦截器。
我们需要在spring bean配置文件中配置拦截器。我们可以定义拦截器来拦截所有客户端请求,或者我们也可以为特定的URI映射配置拦截器。有关详细示例,请参阅Spring MVC Interceptor示例。
-
什么是Spring JdbcTemplate类以及如何使用它?
Spring Framework提供了与JDBC API的出色集成,并提供了JdbcTemplate实用程序类,我们可以使用它来避免来自我们的数据库操作逻辑的bolier-plate代码,例如Opening / Closing Connection,ResultSet,PreparedStatement等。
有关JdbcTemplate示例,请参阅Spring JDBC示例。
-
如何在Spring Web应用程序中使用Tomcat JNDI DataSource?
为了使用servlet容器配置的JNDI DataSource,我们需要在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示例。
-
您如何在Spring中实现事务管理?
Spring框架通过声明式事务管理以及程序化事务管理提供事务管理支持。声明式事务管理是最广泛使用的,因为它易于使用并且适用于大多数情况。
我们使用带注释的方法
@Transactional
注释声明式事务管理。我们需要在spring bean配置文件中为DataSource配置事务管理器。<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
-
什么是春天DAO?
提供Spring DAO支持以一致且简单的方式使用JDBC,Hibernate等数据访问技术。例如,我们有
JdbcDaoSupport
,HibernateDaoSupport
,JdoDaoSupport
并JpaDaoSupport
为各自的技术。Spring DAO还提供异常层次结构的一致性,我们不需要捕获特定的异常。
-
如何集成Spring和Hibernate框架?
我们可以使用Spring ORM模块来集成Spring和Hibernate框架,如果你使用的是SessionFactory提供当前会话的Hibernate 3+,那么你应该避免使用
HibernateTemplate
或者HibernateDaoSupport
更好地使用带有依赖注入的DAO模式进行集成。Spring ORM为使用Spring声明式事务管理提供了支持,因此您应该利用它而不是使用Hibernate样板代码进行事务管理。
为了更好地理解,您应该阅读以下教程:
-
什么是Spring Security?
Spring安全框架侧重于在Java应用程序中提供身份验证和授权。它还会处理大多数常见的安全漏洞,例如CSRF攻击。
通过使用诸如的注释,在Web应用程序中使用Spring安全性非常有用且易于使用
@EnableWebSecurity
。您应该阅读以下帖子以了解如何使用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.journaldev.spring.EmployeeDaoImpl"> <property name="maxReadResults" value="${results.read.max}"/> </bean>
如果您使用注释来配置spring bean,那么您可以注入如下所示的属性。
@Value("${maxReadResults}") private int maxReadResults;
-
列举Spring Framework中使用的一些设计模式?
Spring Framework使用了很多设计模式,其中一些常见的是:
-
Spring Framework有哪些最佳实践?
Spring Framework的一些最佳实践是:
- 避免模式参考中的版本号,以确保我们有最新的配置。
- 根据spring-jdbc.xml,spring-security.xml等问题划分spring bean配置。
- 对于在Spring MVC中的多个上下文中使用的spring bean,在根上下文中创建它们并使用listener初始化。
- 尽可能配置bean依赖项,尽量避免自动装配。
- 对于应用程序级属性,最好的方法是创建属性文件并在spring bean配置文件中读取它。
- 对于较小的应用程序,注释很有用,但对于较大的应用程序,注释可能会变得很麻烦。如果我们在XML文件中拥有所有配置,那么维护它将更容易。
- 为组件使用正确的注释可以轻松理解目的。对于服务,使用@Service和DAO bean使用@Repository。
- Spring框架有很多模块,使用你需要的东西。删除通过Spring Tool Suite模板创建项目时通常添加的所有额外依赖项。
- 如果您使用的是Aspects,请确保尽可能缩小连接点,以避免对不需要的方法提出建议。考虑更易于使用的自定义注释并避免任何问题。
- 在有实际好处时使用依赖注入,仅仅为了松散耦合而不使用它,因为它更难维护。
这就是Spring Framework面试问题的全部内容。我希望这些问题可以帮助您进行Java EE访谈。我一发现就会在列表中继续添加更多问题。如果您知道应该成为列表的一部分的更多问题,请确保为其添加注释,我将包含它。
原创翻译,译文来源:https://www.journaldev.com/2696/spring-interview-questions-and-answers