Spring面试题大全(2024最新版,附全面解析和答案)

Spring是Java领域最广泛使用的企业级框架之一,提供了全面的基础设施支持,涉及依赖注入、事务管理、AOP、数据访问、Web开发表现和安全性等方面。本文将涵盖Spring框架的基础知识、高级功能及其常见面试题,让大家全面掌握Spring,以应对面试中的各种问题。


🧑 博主简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式+人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者,提供产品测评、学习辅导、简历面试辅导、毕设辅导、项目开发、C/C++/Java/Python/Linux/AI等方面的服务,如有需要请站内私信或者联系任意文章底部的的VX名片(ID:gylzbk

💬 博主粉丝群介绍:① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。③ 群内也有职场精英,大厂大佬,可交流技术、面试、找工作的经验。④ 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬。⑤ 进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。

在这里插入图片描述

Spring面试题大全(2024最新版,附全面解析和答案)

在这里插入图片描述

一、Spring 基础概述

1. 什么是Spring?

Spring是一个轻量级、开源的企业级框架,提供了一站式的解决方案以简化企业级应用程序的开发和部署。其核心特性是依赖注入(DI)和面向切面编程(AOP)。

2. Spring的主要模块

  • Spring Core:核心容器模块,提供基础功能,如依赖注入。
  • Spring AOP:实现面向切面编程。
  • Spring ORM:用于集成ORM框架,如Hibernate、JPA等。
  • Spring DAO:提供数据库访问的抽象层。
  • Spring Web:提供Web应用开发的支持,包括Spring MVC。
  • Spring Security:提供全面的安全服务管理。

二、依赖注入(Dependency Injection, DI)

1. 什么是依赖注入?

依赖注入是一种设计模式,用于实现对象之间的松耦合。它通过构造器注入、Setter注入或接口注入,将对象的创建和管理交给Spring IoC容器。

2. 类型

  • 构造器注入:通过构造器将依赖注入。
public class MyService {
    private MyRepository repository;

    @Autowired
    public MyService(MyRepository repository) {
        this.repository = repository;
    }
}
  • Setter注入:通过Setter方法将依赖注入。
public class MyService {
    private MyRepository repository;

    @Autowired
    public void setRepository(MyRepository repository) {
        this.repository = repository;
    }
}

3. ApplicationContext和Bean

Spring的IoC容器是通过ApplicationContext接口实现的,常用的实现包括ClassPathXmlApplicationContextAnnotationConfigApplicationContext

ApplicationContext context =
  new ClassPathXmlApplicationContext("applicationContext.xml");
MyService service = context.getBean(MyService.class);

三、面向切面编程(Aspect-Oriented Programming, AOP)

1. 什么是AOP?

AOP是一种编程范式,通过分离横切关注点(如日志、事务、安全)来提高代码的模块化。Spring AOP通过动态代理实现AOP功能。

2. 术语

  • 切面(Aspect):模块化的横切关注点。
  • 连接点(Join Point):程序执行时的一个点,比如方法调用。
  • 通知(Advice):在特定连接点执行的操作。
  • 切入点(Pointcut):定义匹配连接点的表达式。

3. AOP实现

  • 注解方式
@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Executing: " + joinPoint.getSignature().getName());
    }
}

四、Spring MVC

1. 什么是Spring MVC?

Spring MVC是基于模型-视图-控制器设计模式的Web框架,用于构建Web应用程序。它将业务逻辑、视图和请求处理分离,提高了代码的可维护性。

2. 常用注解

  • @Controller:标识一个控制器。
  • @RequestMapping:映射请求到控制器的方法。
  • @GetMapping@PostMapping:分别用于映射GET和POST请求。
  • @ResponseBody:将控制器方法的返回值直接写入HTTP响应体。
  • @RequestBody:将HTTP请求体映射到Java对象。

3. 示例

@Controller
@RequestMapping("/api")
public class MyController {
    @GetMapping("/hello")
    @ResponseBody
    public String sayHello() {
        return "Hello, Spring MVC!";
    }

    @PostMapping("/user")
    @ResponseBody
    public User createUser(@RequestBody User user) {
        // 创建用户逻辑
        return user;
    }
}

五、Spring Data 和 ORM

1. 什么是Spring Data?

Spring Data是Spring项目的一部分,为数据访问提供统一的Repository接口层。它简化了与数据存储技术(如关系数据库、NoSQL数据库)的集成。

2. Spring Data JPA

通过Spring Data JPA,可以轻松实现与关系数据库的交互。主要接口包括JpaRepositoryCrudRepository

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByLastName(String lastName);
}

3. 配置示例

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update

六、Spring 事务管理

1. 什么是事务管理?

事务管理是指通过编程和声明性方式,控制事务的提交和回滚,确保数据的一致性和完整性。

2. 编程式事务管理

通过Spring的TransactionTemplate进行编程式事务管理:

@Autowired
private TransactionTemplate transactionTemplate;

public void performTransaction() {
    transactionTemplate.execute(status -> {
        // 业务逻辑
        return null;
    });
}

3. 声明式事务管理

使用@Transactional注解进行声明式事务管理:

@Service
public class MyService {

    @Transactional
    public void performTransaction() {
        // 业务逻辑
    }
}

可以在配置中定义事务管理器:

<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
</bean>

七、Spring Security

1. Spring Security概述

Spring Security是一个提供身份验证和授权的框架,保护应用程序免受常见安全漏洞的攻击。

2. 基本配置

通过引入spring-boot-starter-security依赖,快速集成Spring Security:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

然后配置安全设置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .formLogin().and()
            .httpBasic();
    }
}

八、Spring Boot

1. 什么是Spring Boot?

Spring Boot是Spring框架的一个子项目,旨在简化基于Spring的应用开发。Spring Boot通过自动配置和生产级准备功能,使得创建独立、生产级别的Spring应用程序变得更加容易。

2. 创建Spring Boot项目

可以通过Spring Initializr网站快速创建Spring Boot项目,选择需要的依赖并生成项目:

# 或者使用Spring Initializr网站 https://start.spring.io/

3. 应用主类

Spring Boot应用程序的入口是带有@SpringBootApplication注解的主类:

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

九、Spring Cloud

1. 什么是Spring Cloud?

Spring Cloud是Spring生态系统的一部分,提供了一系列工具和框架,用于构建分布式系统和微服务架构,如配置管理、服务发现、负载均衡、断路器等。

2. 常用Spring Cloud组件

  • Spring Cloud Config:集中式配置管理。
  • Spring Cloud Eureka:服务发现和注册。
  • Spring Cloud Ribbon:客户端负载均衡。
  • Spring Cloud Hystrix:断路器机制。
  • Spring Cloud Gateway:API网关服务。

3. 示例

  • 配置中心
    spring.cloud.config.server.git.uri=https://github.com/myrepo/config-repo
    
  • 服务发现
    @EnableEurekaServer
    @SpringBootApplication
    public class EurekaServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerApplication.class, args);
        }
    }
    

十、常见面试题解答

1. Spring IoC容器的作用是什么?

IoC(控制反转)容器负责创建、管理和销毁Spring应用中的Bean,用于实现应用组件之间的松耦合。Spring IoC容器通过自动装配依赖,实现依赖注入(DI),减少硬编码。

2. 什么是Bean的生命周期?

Spring Bean的生命周期包括实例化、属性赋值、初始化和销毁几个阶段。可以通过@PostConstruct@PreDestroy注解自定义初始化和销毁方法。

@Component
public class MyBean {

    @PostConstruct
    public void init() {
        // 初始化逻辑
    }

    @PreDestroy
    public void destroy() {
        // 销毁逻辑
    }
}

3. 如何处理Spring中的循环依赖?

循环依赖指的是两个或多个Bean相互依赖,导致无法自动注入。可以通过以下方式解决:

  • 构造器注入:构造器注入时,避免直接相互依赖。
  • Setter注入:使用Setter注入,将依赖逐步装配。
  • @Lazy注解:延迟加载依赖。
@Component
public class A {
    @Autowired
    @Lazy
    private B b;
}

@Component
public class B {
    @Autowired
    @Lazy
    private A a;
}

4. Spring Boot与Spring框架的区别?

Spring Boot是Spring框架的子项目,通过自动配置、内嵌服务器、独立运行等功能,简化了基于Spring应用的开发、配置和部署。Spring框架是一个更加通用的企业级开发框架,需要手动配置和集成。

5. 如何在Spring中实现事务管理?

使用@Transactional注解实现声明式事务管理。

@Service
public class MyService {

    @Transactional
    public void performTransaction() {
        // 业务逻辑
    }
}

确保在配置文件或Java配置类中启用事务管理。

<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
</bean>

6. Spring Data JPA与Hibernate的关系是什么?

Spring Data JPA是Spring项目的一部分,它简化了与JPA实现(如Hibernate)的集成和开发。Hibernate是一个JPA规范的实现,提供了强大的ORM功能。Spring Data JPA通过高级抽象和Repository接口,使得数据访问层更加简洁和易用。

7. 怎么在Spring Boot中定义并处理自定义异常?

可以通过自定义异常类和@ControllerAdvice注解集中处理异常:

public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ResponseBody
    public ErrorResponse handleResourceNotFoundException(ResourceNotFoundException ex) {
        return new ErrorResponse("NOT_FOUND", ex.getMessage());
    }

    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ErrorResponse handleException(Exception ex) {
        return new ErrorResponse("INTERNAL_SERVER_ERROR", "An unexpected error occurred");
    }
}

8. Spring Security如何处理跨站请求伪造(CSRF)?

Spring Security默认启用了CSRF防护,可以在配置中禁用或自定义处理:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .and()
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .formLogin().and()
            .httpBasic();
    }
}

9. 如何使用Spring的事件机制?

Spring提供了强大的事件机制,可以通过ApplicationEventPublisher发布事件,通过@EventListener方法监听事件。

@Component
public class MyEventPublisher {

    @Autowired
    private ApplicationEventPublisher publisher;

    public void publishEvent(String message) {
        MyEvent event = new MyEvent(this, message);
        publisher.publishEvent(event);
    }
}

public class MyEvent extends ApplicationEvent {
    private String message;

    public MyEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

@Component
public class MyEventListener {

    @EventListener
    public void handleMyEvent(MyEvent event) {
        System.out.println("Received event: " + event.getMessage());
    }
}

10. Spring中的Bean作用域有哪些?

Spring支持以下几种主要的Bean作用域:

  • singleton:单例模式,Spring容器中每个Bean只有一个实例(默认)。
  • prototype:原型模式,每次请求都会创建新的Bean实例。
  • request:针对HTTP请求,每次请求会创建一个新的Bean实例,只在request生命周期内有效(web应用中使用)。
  • session:针对HTTP会话,每个会话创建一个Bean实例,只在session生命周期内有效(web应用中使用)。
  • globalSession:全局HTTP会话,用于Portlet应用。
@Component
@Scope("prototype")
public class MyPrototypeBean {
    // Bean定义
}

11. 如何在Spring Boot中使用外部配置文件?

Spring Boot允许从各种外部配置文件加载配置信息,如application.propertiesapplication.yml。这些文件可以放置在以下位置:

  • src/main/resources/
  • src/main/resources/config/
  • 应用程序外部的配置目录

也可以通过命令行参数指定配置文件:

java -jar myapp.jar --spring.config.name=myconfig

或者在application.properties中指定其他配置文件:

spring.config.location=classpath:/custom-config/

12. Spring Boot的自动配置原理是什么?

Spring Boot的自动配置通过@EnableAutoConfigurationspring.factories文件实现。@EnableAutoConfiguration注解启用自动配置,spring.factories文件定义了需要自动配置的类。

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

META-INF/spring.factories中的配置:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

13. 如何在Spring应用中处理国际化(i18n)?

可以通过配置国际化资源文件和使用MessageSource进行国际化(i18n)处理:

  • 创建国际化资源文件,例如:messages_en.propertiesmessages_fr.properties
  • 配置MessageSource
@Bean
public ResourceBundleMessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("messages");
    return messageSource;
}
  • 在代码中使用国际化消息:
@Autowired
private MessageSource messageSource;

public String getMessage(String code, Object[] args, Locale locale) {
    return messageSource.getMessage(code, args, locale);
}

14. 什么是Spring WebFlux?

Spring WebFlux是基于Reactive Streams的响应式编程框架,适用于高并发和实时数据处理,支持非阻塞、异步IO操作,是Spring MVC的响应式编程替代方案。

  • 定义控制器:
@RestController
@RequestMapping("/api")
public class MyReactiveController {

    @GetMapping("/flux")
    public Flux<String> getFlux() {
        return Flux.just("Hello", "Spring", "WebFlux");
    }
}
  • 配置:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

15. 什么是Spring中的Profile?如何使用?

Spring Profile用于分离配置,以便在不同环境(如开发、测试、生产)之间切换不同的配置。

  • 定义环境配置:
# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost/dev_db
# application-prod.properties
spring.datasource.url=jdbc:mysql://localhost/prod_db
  • 激活Profile:
    • 通过命令行参数:
      java -jar myapp.jar --spring.profiles.active=dev
      
    • 通过配置文件:
      spring.profiles.active=dev
      

16. Spring的声明式缓存是如何实现的?

Spring提供了声明式缓存,通过@EnableCaching@Cacheable等注解实现。

  • 配置缓存:
@Configuration
@EnableCaching
public class CacheConfig {
    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("items");
    }
}
  • 使用缓存:
@Service
public class MyService {

    @Cacheable("items")
    public Item getItemById(Long id) {
        // 模拟数据库查询
        return new Item(id, "Item" + id);
    }

    @CacheEvict(value = "items", allEntries = true)
    public void clearCache() {
        // 清除缓存
    }
}

17. 如何在Spring中实现调度任务?

Spring可以通过@Scheduled注解实现定时任务调度,结合@EnableScheduling启用任务调度功能。

  • 启用调度任务功能:
@Configuration
@EnableScheduling
public class SchedulingConfig {
}
  • 定义调度任务:
@Service
public class ScheduledTaskService {

    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        System.out.println("Current Time: " + new Date());
    }

    @Scheduled(cron = "0 0 12 * * ?")
    public void performTask() {
        System.out.println("Scheduled Task executed at 12 PM");
    }
}

18. Spring的事件驱动模型如何工作?

Spring支持基于观察者设计模式的事件驱动模型,可以通过ApplicationEventApplicationListener组件实现事件发布和监听。

  • 定义自定义事件:
public class CustomEvent extends ApplicationEvent {
    private String message;

    public CustomEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}
  • 发布事件:
@Component
public class CustomEventPublisher {
    @Autowired
    private ApplicationEventPublisher eventPublisher;

    public void publishEvent(String message) {
        CustomEvent customEvent = new CustomEvent(this, message);
        eventPublisher.publishEvent(customEvent);
    }
}
  • 监听事件:
@Component
public class CustomEventListener {
    @EventListener
    public void handleCustomEvent(CustomEvent event) {
        System.out.println("Received custom event - " + event.getMessage());
    }
}

19. 如何在Spring中使用RESTful Web服务客户端?

Spring提供了RestTemplateWebClient两个工具用于构建RESTful Web服务客户端。

使用RestTemplate:

  • 配置RestTemplate Bean:
@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  • 使用RestTemplate调用RESTful服务:
@Service
public class ApiService {

    @Autowired
    private RestTemplate restTemplate;

    public String getForObject(String url) {
        return restTemplate.getForObject(url, String.class);
    }

    public ResponseEntity<String> postForEntity(String url, Object request) {
        return restTemplate.postForEntity(url, request, String.class);
    }
}

使用WebClient(Spring WebFlux):

  • 配置WebClient Bean:
@Configuration
public class WebClientConfig {

    @Bean
    public WebClient.Builder webClientBuilder() {
        return WebClient.builder();
    }
}
  • 使用WebClient调用RESTful服务:
@Service
public class ApiService {

    @Autowired
    private WebClient.Builder webClientBuilder;

    public Mono<String> getForObject(String url) {
        return webClientBuilder.build()
                               .get()
                               .uri(url)
                               .retrieve()
                               .bodyToMono(String.class);
    }

    public Mono<String> postForEntity(String url, Object request) {
        return webClientBuilder.build()
                               .post()
                               .uri(url)
                               .bodyValue(request)
                               .retrieve()
                               .bodyToMono(String.class);
    }
}

20. 如何在Spring应用程序中进行单元测试和集成测试?

Spring提供了强大的测试支持,简化了单元测试和集成测试。

  • 使用Spring的测试注解:
    • @RunWith(SpringRunner.class):用于运行Spring的测试上下文。
    • @SpringBootTest:用于加载Spring Boot应用程序上下文进行集成测试。
    • @MockBean:用于创建和注入Mock对象。
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyServiceTests {

    @Autowired
    private MyService myService;

    @MockBean
    private MyRepository myRepository;

    @Test
    public void testGetData() {
        // 设置Mock行为
        when(myRepository.findData()).thenReturn("Mock Data");

        // 执行测试
        String data = myService.getData();
        assertEquals("Mock Data", data);
    }
}
  • 使用MockMvc进行Web层测试:
@RunWith(SpringRunner.class)
@WebMvcTest(MyController.class)
public class MyControllerTests {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private MyService myService;

    @Test
    public void testGetHello() throws Exception {
        // 设置Mock行为
        when(myService.getHelloMessage()).thenReturn("Hello, Spring Boot!");

        // 执行测试
        mockMvc.perform(get("/api/hello"))
               .andExpect(status().isOk())
               .andExpect(content().string("Hello, Spring Boot!"));
    }
}

21. 如何在Spring应用中实现文件上传和下载?

Spring MVC提供了简洁的方式实现文件上传和下载功能。

文件上传:

  • 创建文件上传表单(HTML):
<form method="POST" enctype="multipart/form-data" action="/upload">
    <input type="file" name="file"/>
    <button type="submit">Upload</button>
</form>
  • 创建文件上传控制器:
@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file) {
        if (!file.isEmpty()) {
            // 保存文件
            String fileName = saveFile(file);
            return "File uploaded successfully: " + fileName;
        } else {
            return "File upload failed";
        }
    }

    private String saveFile(MultipartFile file) {
        // 实现文件保存逻辑
        return file.getOriginalFilename();
    }
}

文件下载:

  • 创建文件下载控制器:
@RestController
public class FileDownloadController {

    @GetMapping("/download")
    public ResponseEntity<Resource> handleFileDownload(@RequestParam String fileName) {
        // 获取文件资源
        Resource file = loadFileAsResource(fileName);

        // 设置响应头
        return ResponseEntity.ok()
                             .contentType(MediaType.parseMediaType("application/octet-stream"))
                             .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"")
                             .body(file);
    }

    private Resource loadFileAsResource(String fileName) {
        // 实现文件资源加载逻辑
        return new FileSystemResource(fileName);
    }
}

22. 如何在Spring中整合第三方库和API?

Spring通过@Bean注解和配置类,轻松整合第三方库和API。

  • 创建配置类:
@Configuration
public class ThirdPartyConfig {

    @Bean
    public ExternalService externalService() {
        return new ExternalServiceImpl();
    }
}
  • 使用第三方库:
@Service
public class MyService {

    private final ExternalService externalService;

    @Autowired
    public MyService(ExternalService externalService) {
        this.externalService = externalService;
    }

    public void performOperation() {
        externalService.execute();
    }
}

十一、总结

通过全面掌握Spring框架的基础知识、高级功能和常见面试题解答,希望大家能够在面试中从容应对,展示出色的技术能力。继续学习和实践,不断提升Spring使用和优化的技巧,在实际项目中发挥Spring的强大功能。祝愿大家在Spring面试中取得优异成绩,成功获取理想的工作机会!继续探索Spring的更深奥功能,在企业级应用开发中不断进步。

Spring源码面试题涉及到对Spring框架的原理核心组件的理解。以下是一些可能的面试题: 1. 请解释一下Spring框架的IoC容器是什么? 引用中提到,Spring的IoC容器是用来管理组织对象及其依赖关系的容器。它负责创建、配置管理应用程序中的对象,并将它们装配在一起。通过IoC容器,我们可以将对象之间的依赖关系委托给容器来处理,而不是在代码中显式地进行依赖关系的管理。 2. 请描述一下Spring Bean的生命周期。 引用中提到,Spring Bean的生命周期包括以下几个阶段: - 实例化:创建Bean的实例。 - 属性填充:将Bean的属性值通过依赖注入的方式填充到Bean中。 - 初始化:调用Bean的初始化方法,可以在配置文件中定义或使用注解标记。 - 销毁:当容器关闭时,调用Bean的销毁方法进行清理工作。 3. 请解释一下Spring中的事件传播器是什么? 引用中提到,Spring的事件传播器是一个组件,它可以接受特定的事件并将其传播给对应的监听器。当某个事件发生时,通过事件传播器,我们可以方便地将事件通知多个监听器,以便它们做出相应的处理。 4. 请解释一下BeanFactoryApplicationContext的区别是什么? BeanFactory是Spring框架的根接口,它定义了IoC容器的基本功能。它提供了创建、配置管理Bean的能力。而ApplicationContext是BeanFactory的子接口,扩展了更多的功能,如国际化、事件传播器、资源加载等。ApplicationContext是更高级、更全面的容器。 以上是一些可能的面试题,希望能对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SSM框架的学习与应用-Java EE企业级应用开发学习记录-(第六天)初识Spring框架](https://download.csdn.net/download/m0_53659738/88275704)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [spring相关的源码面试题](https://blog.csdn.net/weixin_56993128/article/details/125944512)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Spring常见面试题(源码)](https://blog.csdn.net/qq_46312987/article/details/118068743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I'mAlex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值