《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux... 。
文章目录
- 一、本文面试题目录
-
-
-
- 什么是Spring框架?它的主要优势是什么?
-
- Spring框架的核心模块有哪些?各自的作用是什么?
-
- 请解释Spring的设计理念。
-
- Spring IoC容器的作用是什么?
-
- 什么是依赖注入(DI)?Spring支持哪些依赖注入方式?
-
- 比较构造器注入和setter注入的优缺点。
-
- Spring中的Bean是什么?它有哪些作用域?
-
- singleton和prototype作用域的Bean有什么区别?在使用时需要注意什么?
-
- 如何在Spring中定义一个Bean?有哪些方式?
-
- Spring中的Bean生命周期是怎样的?
-
- 什么是BeanFactory和ApplicationContext?它们的区别是什么?
-
- ApplicationContext的实现类有哪些?各自的使用场景是什么?
-
- 如何获取Spring容器中的Bean?
-
- Spring中的@Autowired注解有什么作用?它的注入原理是什么?
-
- @Autowired、@Resource、@Inject注解的区别是什么?
-
-
- 二、125道Spring面试题目录列表
一、本文面试题目录
1. 什么是Spring框架?它的主要优势是什么?
- 定义:Spring是一个开源的轻量级Java企业级应用开发框架,旨在简化复杂的企业级应用开发。它基于控制反转(IoC)和面向切面编程(AOP)等核心技术,提供了一系列的工具和功能,可用于构建各种类型的Java应用程序。
- 优势 :
- 轻量级与低侵入性:Spring框架是轻量级的,对应用程序的资源占用少,且采用低侵入式设计,代码污染极低,不会对业务代码造成过多影响。
- 提高开发效率:提供了如IoC容器、AOP框架、JDBC模板等丰富的工具和技术,能简化开发过程,减少重复代码,提高开发效率,降低开发成本。
- 松耦合:通过IoC将对象的创建和依赖管理交给容器,实现组件之间的松耦合,使模块可独立开发、测试和维护。
- 良好的集成性:具有模块化设计,能轻松与其他框架如Hibernate、MyBatis、Struts2等集成,方便构建复杂的企业级应用。
- 事务管理强大:提供了一套统一的事务管理机制,支持编程式事务管理和声明式事务管理,可保证数据的一致性和可靠性。
2. Spring框架的核心模块有哪些?各自的作用是什么?
- 核心容器模块:包括spring - core、spring - beans、spring - context和spring - expression。提供IoC容器,管理Bean的生命周期和依赖注入。其中spring - core是基础工具类与依赖注入支持;spring - beans用于Bean工厂与Bean的定义;spring - context扩展了BeanFactory,支持国际化、事件传播等;spring - expression是Spring表达式语言,用于动态查询和操作对象。
- 数据访问与集成模块:包含spring - jdbc、spring - tx、spring - orm等。用于简化数据库操作和事务管理,如spring - jdbc是JDBC抽象层,减少模板代码;spring - tx提供声明式事务管理;spring - orm用于集成ORM框架。
- Web模块:有spring - web、spring - webmvc等。提供创建Web应用程序的支持,spring - web提供HTTP客户端等基础功能,spring - webmvc是基于Servlet的MVC框架。
- AOP与Instrumentation模块:spring - aop提供面向切面编程支持,spring - aspects集成AspectJ的切面库,spring - instrumentation用于类加载器实现,支持服务器级监控。
- 测试模块:spring - test集成JUnit或TestNG,支持Spring上下文测试和Mock对象。
3. 请解释Spring的设计理念。
- 轻量级:尽可能减少对系统资源的占用,采用轻量级设计,让应用程序可以快速启动并运行,框架本身的代码量和资源消耗都较低。
- 松耦合:通过依赖注入和面向接口编程,将组件之间的依赖关系交由容器管理,使不同模块可独立开发、测试和维护,降低系统复杂性,提高代码的可重用性和可扩展性。
- 面向切面编程:支持AOP,可将与业务逻辑无关的横切关注点(如日志记录、事务管理等)从主要业务逻辑中解耦出来,以切面的方式插入到应用程序执行流程中,提高代码的可维护性和可扩展性。
- 容器化:提供IoC容器,负责创建、配置和管理对象的生命周期,将对象的创建和依赖管理从应用程序代码中分离出来,简化开发工作,提高代码的可测试性。
- 综合性:提供了众多功能模块,涵盖数据访问、事务管理、安全性等应用程序的各个层面,开发者可根据需求选择模块,灵活构建应用程序。
4. Spring IoC容器的作用是什么?
Spring IoC容器是Spring框架的核心组件,主要作用是管理对象(Bean)的生命周期和依赖关系。它通过读取配置元数据(可以是XML、注解或Java配置类)来创建、配置和组装Bean。容器负责在应用程序需要时创建Bean实例,管理其初始化、销毁等生命周期阶段,还能通过依赖注入将Bean之间的依赖关系进行自动装配,使得应用程序中的组件更加灵活和可维护,降低了组件之间的耦合度,提高了代码的可测试性和可重用性。
5. 什么是依赖注入(DI)?Spring支持哪些依赖注入方式?
- 定义:依赖注入是一种设计模式,在这种模式下,对象无需自己创建依赖对象,而是由外部容器将依赖对象注入到该对象中。开发者只需描述如何创建对象以及对象之间的依赖关系,由IoC容器根据这些描述来完成对象的创建和装配。
- 注入方式:Spring支持构造函数注入、setter注入和接口注入,不过在Spring框架中主要使用构造函数注入和setter注入。构造函数注入是通过类的构造函数将依赖对象传入;setter注入则是通过对象的setter方法来设置依赖对象。
6. 比较构造器注入和setter注入的优缺点。
- 构造器注入 :
- 优点:依赖字段可声明为final,保证线程安全和对象状态一致性;强制要求所有必需依赖,避免NullPointerException;结合Lombok的@RequiredArgsConstructor可自动生成构造方法,代码更简洁;在单元测试中易于手动注入依赖。
- 缺点:对可选依赖支持较差,通常需通过重载构造方法实现;无法处理构造器级别的循环依赖,否则Spring会抛出异常。
- setter注入 :
- 优点:支持可选依赖,可动态重新配置依赖,灵活性高;Spring容器可处理setter注入的循环依赖问题;适合将旧代码逐步迁移到依赖注入模式,无需修改现有构造方法。
- 缺点:对象可能在未完全初始化时被使用,存在状态不稳定风险;依赖的可变性可能导致多线程环境下的线程安全问题。
7. Spring中的Bean是什么?它有哪些作用域?
- 定义:Bean是由Spring IoC容器管理的对象,是构成用户应用程序的主干。它们由Spring IoC容器实例化、配置、装配和管理,基于用户提供给容器的配置元数据创建。
- 作用域:Spring提供了多种Bean作用域,常见的有singleton(单例)、prototype(原型)、request(请求)、session(会话)等。singleton作用域的Bean在容器中只有一个实例,prototype作用域的Bean每次请求都会创建一个新实例,request作用域的Bean在每次HTTP请求中创建一个实例,session作用域的Bean在每个HTTP会话中创建一个实例。
8. singleton和prototype作用域的Bean有什么区别?在使用时需要注意什么?
- 区别:singleton作用域的Bean在整个Spring容器生命周期内只会创建一个实例,无论有多少个地方引用该Bean,都是引用同一个实例。而prototype作用域的Bean,每次从容器中获取时,都会创建一个新的实例。
- 注意事项:使用singleton作用域时,由于是单例,要注意Bean的线程安全性,尽量保证其是无状态的,避免多个线程访问时产生数据不一致等问题。对于prototype作用域的Bean,因为每次都会创建新实例,所以要注意资源消耗,特别是在频繁获取的情况下,可能会消耗较多内存等资源,且容器不会自动管理其销毁,若Bean中持有一些资源,需要在代码中手动释放。
9. 如何在Spring中定义一个Bean?有哪些方式?
- 基于XML配置:在XML配置文件中使用标签定义Bean,例如:
xml
<bean id="userService" class="com.example.service.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.example.dao.UserDao"/>
- 基于注解配置:在类上使用@Component、@Service、@Repository、@Controller等注解,这些注解都可以将类标记为一个Bean,Spring会自动扫描并将其纳入容器管理。例如:
java
@Service
public class UserService {
// 业务逻辑
}
- 基于Java配置类:通过@Configuration注解定义配置类,使用@Bean注解在配置类中定义Bean。例如:
java
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
10. Spring中的Bean生命周期是怎样的?
- 实例化:Spring容器根据配置元数据创建Bean的实例,可通过构造函数或反射等方式完成。
- 依赖注入:容器将Bean所依赖的其他Bean或属性值注入到该Bean中,根据配置的注入方式(构造器注入或setter注入等)来实现。
- 初始化前处理:如果Bean实现了BeanNameAware接口,容器会调用其setBeanName方法设置Bean的名称;如果实现了BeanFactoryAware接口,会调用其setBeanFactory方法传入BeanFactory实例。
- 初始化:若Bean实现了InitializingBean接口,会调用其afterPropertiesSet方法;若配置了init - method属性,会调用指定的初始化方法。
- 使用:Bean初始化完成后,可被应用程序中的其他组件获取和使用。
- 销毁前处理:当容器关闭时,若Bean实现了DisposableBean接口,会调用其destroy方法;若配置了destroy - method属性,会调用指定的销毁方法。
- 销毁:Bean被销毁,释放其所占用的资源。
11. 什么是BeanFactory和ApplicationContext?它们的区别是什么?
- BeanFactory:是Spring IoC容器的基础接口,它就像一个包含Bean集合的工厂类,负责管理Bean的创建和生命周期,会在客户端要求时实例化Bean,提供了基本的IoC功能。
- ApplicationContext:是BeanFactory的子接口,在BeanFactory基础上扩展了许多功能,如支持国际化、事件传播、资源加载等,更适合企业级应用开发。
- 区别:ApplicationContext继承了BeanFactory,具备BeanFactory的所有功能,并且额外提供了更多高级功能。BeanFactory是延迟加载,当获取Bean时才创建实例;而ApplicationContext在启动时就会创建所有单例Bean。此外,ApplicationContext对Spring的各种功能支持更全面,如对Web应用的支持、事件机制等,而BeanFactory相对更基础和简单。
12. ApplicationContext的实现类有哪些?各自的使用场景是什么?
- ClassPathXmlApplicationContext:从类路径下加载XML配置文件来创建容器,适用于传统的Java应用程序,配置文件位于类路径下,例如:
java
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
- FileSystemXmlApplicationContext:从文件系统中加载XML配置文件创建容器,可用于需要从特定文件系统路径加载配置的场景,如:
java
ApplicationContext context = new FileSystemXmlApplicationContext("D:/config/applicationContext.xml");
- AnnotationConfigApplicationContext:用于加载基于注解的配置类来创建容器,适用于基于注解驱动的Spring应用,推荐在新的项目中使用,例如:
java
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
- WebApplicationContext及其子类,如XmlWebApplicationContext:主要用于Web应用程序,用于管理Web相关的Bean,加载Web应用的配置信息,通常与Servlet容器集成,在Web项目启动时初始化。
13. 如何获取Spring容器中的Bean?
- 通过ApplicationContext的getBean方法:可以根据Bean的名称或类型获取Bean。例如:
java
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
// 或者根据类型获取
UserService userService2 = context.getBean(UserService.class);
- 在Spring管理的组件中自动注入:通过@Autowired、@Resource等注解,将需要的Bean自动注入到其他Bean中,例如:
java
@Service
public class OrderService {
@Autowired
private UserService userService;
//...
}
- 实现ApplicationContextAware接口:让类实现ApplicationContextAware接口,重写setApplicationContext方法,在方法中获取ApplicationContext实例,进而获取Bean。例如:
java
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class BeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
BeanUtil.applicationContext = applicationContext;
}
public static Object getBean(String beanName) {
return applicationContext.getBean(beanName);
}
}
14. Spring中的@Autowired注解有什么作用?它的注入原理是什么?
- 作用:@Autowired注解用于自动装配Bean,它可以标注在字段、方法或构造函数上,Spring容器会根据类型自动将匹配的Bean注入到标注该注解的位置。
- 注入原理:Spring容器在启动时,会扫描所有被@Component等注解标记的Bean,并将其注册到容器中。当遇到@Autowired注解时,会根据注解标注的字段或方法参数的类型,在容器中查找与之匹配的Bean。如果只有一个匹配的Bean,则直接注入;如果有多个匹配的Bean,则会根据@Qualifier注解等进一步确定具体要注入的Bean,若没有找到匹配的Bean或匹配不唯一且未正确指定 qualifier等,会抛出异常。
15. @Autowired、@Resource、@Inject注解的区别是什么?
- @Autowired:是Spring框架提供的注解,基于类型进行自动装配,默认要求注入的Bean必须存在,否则会抛出异常。可结合@Qualifier注解根据Bean的名称来更精确地指定要注入的Bean。
- @Resource:是Java EE提供的注解,默认按照ByName方式进行装配,也可以通过指定name属性来明确装配的Bean名称,若未指定name属性,则会以字段名或方法名作为Bean名称去容器中查找。当按照ByName找不到对应的Bean时,会再尝试按照ByType进行装配。
- @Inject:是Java EE提供的注解,功能与@Autowired类似,也是基于类型进行注入,同样可以结合@Qualifier注解使用,它需要导入javax.inject包,在一些不支持Spring框架但支持Java EE规范的环境中也可使用。