Spring IoC面试题解析

1. 在配置类上写 @ComponentScan 注解来进行包扫描

  • 在Spring中,通过在配置类上添加@ComponentScan注解可以自动扫描指定包及其子包下的所有标注有特定注解(如@Component, @Service, @Repository, @Controller等)的类,并将它们作为Bean注册到IoC容器中。例如:
@Configuration
@ComponentScan("com.example.myapp")
public class AppConfig {
    // ...
}

2. 你对Spring IoC容器的定义:

  • Spring IoC (Inversion of Control 控制反转) 容器是Spring框架的核心部分,它负责管理应用对象的生命周期和依赖关系。它是一个容器,因为它存储并管理着应用程序中的Bean实例;同时,它执行IoC原则,即由容器控制程序之间的依赖关系,而非传统编程方式中由程序代码直接控制。

3. XML配置文件的形式和配置类的形式的区别

  • XML形式配置:传统的Spring应用通常采用XML文件来声明Bean的定义,包括Bean的属性、构造器参数、依赖关系等,这种方式比较直观且结构清晰,但相对较为冗长,可读性不如注解。

  • 配置类形式(Java-based配置):从Spring 3.x开始支持基于Java的配置,通过@Configuration、@Bean等注解编写类来替代XML配置,这种形式更贴近Java编程模型,可以利用Java的强大功能如类型安全、IDE辅助和元编程能力,同时也更加内聚和模块化。

4. FilterType.CUSTOM自定义类型如何使用?

  • 在Spring的@ComponentScan中,FilterType.CUSTOM允许用户自定义过滤规则。通过实现TypeFilter接口或使用lambda表达式定义一个Predicate逻辑来筛选哪些类应被包含或排除在组件扫描范围内。例如:
@ComponentScan(includeFilters = @Filter(type = FilterType.CUSTOM, classes = MyCustomTypeFilter.class))

其中,MyCustomTypeFilter需要实现org.springframework.core.type.TypeFilter接口。

5. 排除用法 excludeFilters

  • excludeFilters属性用于在@ComponentScan中排除特定类型的组件扫描,不将它们注册为Bean。例如:
@ComponentScan(excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = {SomeExcludedAnnotation.class}))

上述代码会排除标记有SomeExcludedAnnotation注解的所有类。

6. 说说 @ComponentScan.Filter type 的类

  • @ComponentScan.Filtertype属性指定了过滤器类型,它可以是诸如ANNOTATION、ASSIGNABLE_TYPE、ASPECTJ、CUSTOM等预设类型,分别对应按注解、按给定类或其子类、按AspectJ表达式以及自定义过滤规则进行筛选。

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

  • Bean的生命周期是指在Spring IoC容器中一个Bean从创建到销毁所经历的一系列过程,包括初始化、依赖注入、Bean的使用以及最终销毁。这个过程中涉及的方法调用包括:实例化、设置属性、调用@PostConstruct注解的方法、在容器中可用、调用@PreDestroy注解的方法等。

8. 如何通过@Scope指定的作用域方法取值?

  • 使用@Scope注解可以指定Bean的作用域,比如单例(Singleton)、原型(Prototype)或其他自定义作用域。例如:
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PrototypeBean {
    // ...
}

可以通过设置value属性的字符串值来自定义作用域。

9. 如何通过实现 FactoryBean 接口来实现注册组件?

  • 实现org.springframework.beans.factory.FactoryBean接口后,可以通过自定义的方式来生产Bean实例。当Spring容器遇到这样的FactoryBean时,不会直接实例化该类,而是调用其getObject()方法获取实际要注入到其他Bean的实例。

10. AnnotationConfigApplicationContext的创建为我们做了什么?

  • 创建AnnotationConfigApplicationContext实例时,它会根据传入的配置类自动执行组件扫描、依赖注入、Bean的初始化等工作,构建并启动一个完全基于注解的Spring IoC容器,从而无需XML配置文件即可加载和管理应用上下文。

11. 如何通过 InitializingBeanDisposableBean 的两个接口实现?

  • InitializingBean接口提供了afterPropertiesSet()方法,在所有必需的属性设置完成后由Spring容器自动调用,用于初始化工作。
  • DisposableBean接口则提供了destroy()方法,当Bean不再需要时由容器调用来清理资源或执行释放操作。

12. 我们自己的组件如何使用 Spring IoC 底层组件?

  • 我们可以通过构造函数、setter方法或字段注入的方式,将IoC容器中托管的其他Bean作为依赖注入到我们自定义的组件中。此外,还可以通过@Autowired注解实现自动装配。

13. 控制反转(IOC)有什么作用

  • 控制反转的主要作用是降低组件间的耦合度,使应用程序各组件之间解耦,提高系统的灵活性和可维护性。通过容器统一管理和维护对象的生命周期及相互依赖关系,开发者只需关注业务逻辑本身,而不需要显式地创建或管理对象。

14. IOC的优点是什么?

  • IOC的优点包括:
    • 解耦: 各组件之间松散耦合,更容易进行单元测试和独立开发。
    • 依赖管理: 容器负责管理组件间的依赖关系,简化了依赖注入的过程。
    • 可配置与可扩展: 组件的行为可通过配置文件或注解动态改变,便于扩展新的功能和服务。
    • 资源管理: 容器能有效地管理和回收资源,如数据库连接、线程池等。

15. Spring IOC 的实现机制

  • Spring IoC的实现机制主要包括两个核心概念:依赖注入(DI)和Bean工厂。Spring IoC容器在启动时读取配置信息,通过反射机制实例化Bean,处理Bean之间的依赖关系,并按照Bean定义中的策略进行初始化和装配。在运行时,根据请求获取Bean实例并管理其生命周期。整个过程体现了控制反转的思想,使得应用程序的对象创建和依赖管理交由容器来控制。

相关推荐

  1. Spring IoC面试题解

    2024-04-12 21:44:03       40 阅读
  2. 面试宝藏】Redis 常见面试题解

    2024-04-12 21:44:03       26 阅读
  3. 面试宝藏】MySQL 面试题解

    2024-04-12 21:44:03       34 阅读
  4. SpringIoC原理

    2024-04-12 21:44:03       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-12 21:44:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-12 21:44:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-12 21:44:03       87 阅读
  4. Python语言-面向对象

    2024-04-12 21:44:03       96 阅读

热门阅读

  1. hibernate缓存

    2024-04-12 21:44:03       44 阅读
  2. python-pytorch实现lstm模型预测文本输出0.1.00

    2024-04-12 21:44:03       27 阅读
  3. 前端响应式布局方式及其优缺点大全

    2024-04-12 21:44:03       39 阅读
  4. 前端面试题(1)

    2024-04-12 21:44:03       30 阅读
  5. 基础知识点全覆盖(1)

    2024-04-12 21:44:03       33 阅读
  6. Go导入私有仓库

    2024-04-12 21:44:03       39 阅读
  7. 蓝桥集训之修理牛棚

    2024-04-12 21:44:03       43 阅读
  8. XGB-25:Callback函数

    2024-04-12 21:44:03       40 阅读
  9. Linux学习 - 又双叒叕一个软件安装方法

    2024-04-12 21:44:03       37 阅读
  10. vue3获取当前路由为什么一直是 / ?

    2024-04-12 21:44:03       36 阅读
  11. docker命令

    2024-04-12 21:44:03       40 阅读