面试常见题之spring
在Java软件工程师面试中,关于Spring的题目是非常常见的。本文准备了20个Spring相关的面试题目及其参考答案,这些题目涵盖了Spring框架的基本概念、核心功能、设计模式、IoC容器、AOP、事务管理等多个方面,旨在全面考察面试者对Spring框架的掌握程度。
1. 什么是Spring框架?
参考答案:
Spring框架是一个为Java应用程序开发提供综合、广泛基础性支持的Java平台。Spring框架的设计目标是解决企业级应用开发的复杂性,通过IoC(控制反转)和AOP(面向切面编程)等核心技术,帮助开发者实现模块间的解耦合,降低开发难度,提高开发效率。
2. Spring框架的设计目标、设计理念和核心是什么?
参考答案:
设计目标:提供一个一站式轻量级应用开发平台。
设计理念:支持POJO和JavaBean开发方式,使应用面向接口开发,通过IoC容器实现对象耦合关系的管理,并实现依赖反转。
核心:IoC容器和AOP模块。IoC容器负责对象的创建、配置和服务加载等;AOP模块则提供面向切面编程的支持,允许开发者将跨多个点的应用程序关注点分离出来形成可重用的功能组件。
3. Spring框架有哪些模块?
参考答案:
Spring框架由多个核心模块组成,主要包括:
Spring Core:提供IoC和依赖注入功能。
Spring Context:提供应用程序上下文,包括对象的创建、管理和销毁等功能。
Spring AOP:提供面向切面编程的支持。
Spring DAO:提供对数据访问对象(DAO)的支持。
Spring JDBC:提供对JDBC的简化访问。
Spring Transaction:提供对事务管理的支持。
Spring Web:提供基于MVC模式的Web开发支持。
4. 解释Spring中的IoC(控制反转)和DI(依赖注入)。
参考答案:
IoC(控制反转):是一种设计原则,用于实现低耦合。在Spring中,对象的依赖关系由Spring容器管理,而不是由对象自己创建或查找。
DI(依赖注入):是实现IoC的具体手段。在Spring中,DI通过构造函数、Setter方法或接口注入等方式,将对象的依赖关系注入到所需的地方。
5. Spring IoC容器的主要接口有哪些?
参考答案:
Spring IoC容器的主要接口有BeanFactory和ApplicationContext。BeanFactory是基础容器接口,提供了基本的Bean管理功能;ApplicationContext是BeanFactory的子接口,增加了更多的高级功能,如国际化处理、事件发布等。
6. Spring中Bean的作用域有哪些?
参考答案:
Spring中Bean的作用域主要包括:
singleton:默认作用域,每个容器一个实例。
prototype:每次请求一个新实例。
request:每次HTTP请求一个新实例(仅适用于Web应用)。
session:每个用户会话一个新实例(仅适用于Web应用)。
application/global-session:全局作用域,整个Web应用共享一个实例(global-session是application的Web特定变体,用于Portlet应用)。
7. Spring的AOP是什么?它有哪些实现方式?
参考答案:
AOP(面向切面编程)是一种编程范式,允许开发人员定义跨多个点的应用程序的关注点。Spring AOP通过动态代理技术实现,主要有两种实现方式:
JDK动态代理:基于接口的代理,要求目标对象必须实现一个接口。
CGLIB动态代理:基于类的代理,通过继承目标类来实现代理。
8. Spring MVC的工作原理是什么?
参考答案:
Spring MVC的工作原理基于MVC(模型-视图-控制器)设计模式,具体流程如下:
用户发送请求到前端控制器(DispatcherServlet)。
DispatcherServlet查询HandlerMapping,找到处理请求的Controller。
DispatcherServlet将请求提交到Controller。
Controller调用业务逻辑处理后,返回ModelAndView。
DispatcherServlet查询ViewResolver,找到ModelAndView指定的视图。
视图渲染,返回给客户端。
9. Spring中常用的注解有哪些?并简述其作用。
参考答案:
@Controller:用于标记在类上,表示该类是一个Spring MVC的控制器。
@RequestMapping:用于类或方法上,定义请求的URL地址。
@Autowired:用于自动装配Bean,可以装配构造函数、字段或setter方法。
@Resource:作用类似于@Autowired,但它是JSR-250提供的注解,可以指定name属性。
@Service、@Repository、@Component:用于标注业务层、数据访问层和组件层的Bean。
@ModelAttribute:用于将请求参数绑定到Model属性上。
@SessionAttributes:用于将Model中的属性存储到HttpSession中。
10. Spring事务管理的方式有哪些?
参考答案:
Spring事务管理的方式主要有两种:
编程式事务管理:在代码中显式调用开启事务、提交事务、回滚事务的相关方法。
声明式事务管理:底层建立在AOP的基础之上,通过配置方式声明事务的边界和属性,由Spring自动处理事务的提交和回滚。
11. Spring中如何配置声明式事务?
参考答案:
在Spring中配置声明式事务,通常需要在Spring配置文件中使用tx:advice、tx:attributes和aop:config等元素来定义事务通知和切点,然后通过aop:advisor将事务通知和切点关联起来。也可以使用基于注解的配置方式,通过@Transactional注解来声明事务。
12. @Transactional注解的常用属性有哪些?
参考答案:
@Transactional注解的常用属性包括:
propagation:事务的传播行为。
isolation:事务的隔离级别。
timeout:事务的超时时间。
readOnly:是否只读事务。
rollbackFor:指定哪些异常必须回滚事务。
noRollbackFor:指定哪些异常不需要回滚事务。
13. Spring框架是如何实现AOP的?
参考答案:
Spring框架通过动态代理技术实现AOP。对于实现了接口的类,Spring使用JDK动态代理;对于没有实现接口的类,Spring使用CGLIB动态代理。在运行时,Spring会为目标对象创建代理对象,并在代理对象中添加额外的功能(如日志、事务等),从而实现横切关注点的功能。
14. Spring Bean的生命周期是怎样的?
参考答案:
Spring Bean的生命周期经历四个阶段:
实例化:Spring容器根据配置信息实例化Bean对象。
属性注入:通过依赖注入将Bean的依赖关系注入到Bean对象中。
初始化:执行Bean的初始化方法(如init-method指定的方法或实现了InitializingBean接口的afterPropertiesSet方法)。
销毁:在容器关闭时,执行Bean的销毁方法(如destroy-method指定的方法或实现了DisposableBean接口的destroy方法)。
15. 如何理解Spring中的依赖注入?
参考答案:
依赖注入(DI)是实现控制反转(IoC)的具体手段。在Spring中,依赖注入通过构造函数、Setter方法或接口注入等方式,将对象的依赖关系注入到所需的地方。这样,对象的创建和依赖关系的维护就交给了Spring容器,而不是由对象自己负责,从而实现了对象之间的解耦合。
16. Spring中Bean的装配方式有哪些?
参考答案:
Spring中Bean的装配方式主要有两种:
基于XML的配置:在Spring配置文件中通过标签显式声明Bean及其依赖关系。
基于注解的配置:通过@Component、@Service、@Repository等注解来标注Bean,并使用@Autowired、@Resource等注解来实现依赖注入。此外,还可以使用@Configuration和@Bean注解来定义配置类和Bean方法,实现基于Java的配置。
17. Spring的AOP和AspectJ有什么区别?
参考答案:
Spring AOP和AspectJ都是面向切面编程的实现方式,但它们之间存在以下区别:
实现机制:Spring AOP基于动态代理技术实现;AspectJ则是一个完整的AOP框架,它可以在编译时或加载时织入切面。
功能范围:Spring AOP通常用于Spring应用程序中,与Spring框架紧密集成;AspectJ则是一个独立的AOP框架,可以应用于任何Java应用程序。
性能:由于AspectJ可以在编译时或加载时织入切面,因此它通常比Spring AOP具有更好的性能。
18. Spring MVC中的DispatcherServlet是如何工作的?
参考答案:
DispatcherServlet是Spring MVC的前端控制器,它负责接收客户端发送的请求,并根据请求URL找到对应的Controller和HandlerMethod进行处理。具体工作流程如下:
客户端发送请求到DispatcherServlet。
DispatcherServlet查询HandlerMapping,找到处理请求的Controller和HandlerMethod。
DispatcherServlet将请求提交到Controller。
Controller调用业务逻辑处理请求,并返回ModelAndView对象。
19. Spring Bean的生命周期是怎样的?
答案概述:Spring Bean的生命周期包括:实例化Bean、设置Bean的属性(依赖注入)、BeanNameAware的setBeanName()、BeanFactoryAware的setBeanFactory()、ApplicationContextAware的setApplicationContext()、BeanPostProcessor的postProcessBeforeInitialization()、初始化(实现InitializingBean接口的afterPropertiesSet()或自定义的init-method)、BeanPostProcessor的postProcessAfterInitialization()、使用Bean、销毁Bean(实现DisposableBean接口的destroy()或自定义的destroy-method)。
20. @Autowired和@Resource的区别是什么?
答案概述:@Autowired是Spring的注解,用于自动装配bean,默认按类型装配。如果容器中存在多个相同类型的bean,则可以通过@Qualifier指定名称来装配。@Resource是JSR-250提供的注解,默认按名称装配,如果找不到名称匹配的bean,则按类型装配。@Resource可以指定name和type属性,而@Autowired只能指定required属性。