Spring面试题及详细答案 125道(1-15) -- 核心概念与基础1

前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux... 。

前后端面试题-专栏总目录

文章目录

  • 一、本文面试题目录
        1. 什么是Spring框架?它的主要优势是什么?
        1. Spring框架的核心模块有哪些?各自的作用是什么?
        1. 请解释Spring的设计理念。
        1. Spring IoC容器的作用是什么?
        1. 什么是依赖注入(DI)?Spring支持哪些依赖注入方式?
        1. 比较构造器注入和setter注入的优缺点。
        1. Spring中的Bean是什么?它有哪些作用域?
        1. singleton和prototype作用域的Bean有什么区别?在使用时需要注意什么?
        1. 如何在Spring中定义一个Bean?有哪些方式?
        1. Spring中的Bean生命周期是怎样的?
        1. 什么是BeanFactory和ApplicationContext?它们的区别是什么?
        1. ApplicationContext的实现类有哪些?各自的使用场景是什么?
        1. 如何获取Spring容器中的Bean?
        1. Spring中的@Autowired注解有什么作用?它的注入原理是什么?
        1. @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规范的环境中也可使用。

二、125道Spring面试题目录列表

文章序号 Spring面试题125道
1 Spring面试题及详细答案125道(01-15)
2 Spring面试题及详细答案125道(16-25)
3 Spring面试题及详细答案125道(26-45)
4 Spring面试题及详细答案125道(46-65)
5 Spring面试题及详细答案125道(66-75)
6 Spring面试题及详细答案125道(76-90)
7 Spring面试题及详细答案125道(91-110)
8 Spring面试题及详细答案125道(111-125)
相关推荐
鼠爷ねずみ4 小时前
SpringCloud前后端整体开发流程-以及技术总结文章实时更新中
java·数据库·后端·spring·spring cloud
从心归零7 小时前
springboot-jpa的批量更新方法
java·spring boot·spring
LiamTuc7 小时前
Hibernate‌
spring
小许学java10 小时前
Spring事务和事务传播机制
java·数据库·spring·事务
这是程序猿12 小时前
基于java的ssm框架经典电影推荐网站
java·开发语言·spring boot·spring·经典电影推荐网站
jiayong2312 小时前
海外求职平台与策略指南
java·spring
SadSunset12 小时前
(37)全注解式开发AOP
java·spring
子超兄13 小时前
Bean生命周期
java·spring
Mr.朱鹏14 小时前
超时订单处理方案实战指南【完整版】
java·spring boot·redis·spring·rabbitmq·rocketmq·订单
Lisonseekpan14 小时前
RBAC 基于角色的访问控制模型详解与实践指南
java·服务器·网络·后端·spring·log4j