当前位置: 首页 > article >正文

第29周 面试题精讲(2)

Java面试题详解

一、谈谈你对IOC与DI的理解

问题:在面试过程中,面试官提起Spring时,一定会问到IOC和DI的相关问题。但往往我们对IOC和DI的理解都是一知半解。那么,什么是IOC呢?

答案

  • IOC(控制反转):是一种设计理念,要求将对象的创建和控制交给第三方容器,而不是在代码中直接使用new关键字创建对象。它通过将对象的创建和管理交给容器来实现解耦,使得代码更加灵活和可维护。
  • DI(依赖注入):是IOC的具体实现方式,指在运行时由容器动态地将依赖对象注入到需要它们的组件中。通过DI,组件不需要自己创建依赖对象,只需要声明需要的依赖,由容器负责提供,进一步实现了组件间的解耦。

示例

// 传统方式创建对象
IDao dao = new UserDao();

// 使用Spring的IOC和DI
IDao dao = applicationContext.getBean("userDao", IDao.class);

解释

  • 在传统方式中,如果需要更换UserDao为其他实现类,需要修改所有使用UserDao的地方,维护成本高。
  • 使用Spring的IOC和DI后,对象的创建和管理交给ApplicationContext容器,通过配置文件或注解定义对象的依赖关系。当需要更换实现类时,只需修改配置文件,无需修改业务代码,大大提高了系统的可维护性和扩展性。

二、谈谈你对Spring框架中BeanFactory与ApplicationContext的区别

问题:在Spring框架中,BeanFactory和ApplicationContext有什么区别?

答案

  • BeanFactory:是IOC容器最顶级的接口,提供基本的IOC容器功能,如Bean的创建和管理。它的实现类只实现了IOC容器对象管理的基本功能,使用对象延迟加载,只有在首次调用getBean时才初始化Bean。
  • ApplicationContext:在BeanFactory基础上扩展了一系列功能,如国际化、自动装配、事件发布等。它在容器初始化时就预加载所有单例Bean,提高访问效率,是日常开发中常用的IOC容器。

表格对比

特性BeanFactoryApplicationContext
功能范围提供基本的IOC容器功能在BeanFactory基础上扩展了更多企业级功能
加载方式按需加载,只有在首次调用getBean时才初始化Bean容器初始化时就预加载所有单例Bean
配置方式支持XML、注解等多种配置方式支持XML、注解等多种配置方式
使用场景适用于轻量级应用或需要延迟加载的场景是Spring框架中推荐使用的IOC容器,适用于大多数应用场景

三、请你介绍一下Spring中使用了哪些设计模式

问题:在Spring中使用了哪些设计模式?

答案

  1. 工厂模式:IOC容器作为对象工厂,根据配置信息动态创建对象,如BeanFactoryApplicationContext
  2. 单例模式:Spring容器默认以单例模式管理Bean,确保每个Bean在容器中只有一个实例。
  3. 代理模式:AOP功能的底层实现,通过代理对象为原始对象增加额外功能,如JDK动态代理和CGLIB代理。
  4. 适配器模式:AOP中的通知机制使用适配器模式将不同类型的通知适配到统一的拦截器链中。
  5. 观察者模式:Spring事件驱动模型中,应用上下文发布事件,监听器监听并响应事件。
  6. 模板方法模式:在数据访问层(DAO)中,JdbcTemplate等模板类封装了JDBC操作的通用流程,简化了数据访问代码。

示例

  • 工厂模式:通过ApplicationContext获取Bean实例,无需关心创建细节。
  • 单例模式:配置文件中设置<bean>标签的singleton属性为true(默认值),即可让该Bean以单例模式存在。
  • 代理模式:使用@Aspect定义切面,通过代理为业务方法添加横切关注点,如日志记录、事务管理等。
  • 适配器模式:AOP中的MethodBeforeAdviceAfterReturningAdviceThrowsAdvice等适配器将不同类型的通知转换为统一的拦截器接口。
  • 观察者模式:通过ApplicationEventPublisher发布事件,ApplicationListener监听并处理事件,实现对象间的一对多依赖关系。
  • 模板方法模式:使用JdbcTemplatequeryForObjectqueryForList等模板方法,简化数据查询操作,无需关注底层JDBC细节。

http://www.kler.cn/a/594291.html

相关文章:

  • helm部署metricbeat
  • Fiddler查看响应时间
  • django入门教程之request和reponse【二】
  • Bash中关于制表符\t站位情况说明
  • Verilog-HDL/SystemVerilog/Bluespec SystemVerilog vscode 配置
  • 【 Kubernetes 风云录 】- Istio的一致性哈希机制
  • Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装
  • 【自定义微信小程序拉下选择过滤组件】searchable-select
  • 每日OJ_牛客_MT1最大差值_模拟+贪心_C++_Java
  • 超详细正则表达式逐字解析!!!
  • 更改 docker0 IP
  • 【python】OpenCV—Template Matching
  • 科技查新和查收查引有什么区别?
  • 9、Python collections模块高效数据结构
  • react 中 key 的使用
  • 比特币牛市还在不在
  • 高级java每日一道面试题-2025年3月05日-微服务篇[Eureka篇]-Eureka在微服务架构中的角色?
  • 2025-03-20 学习记录--C/C++-C 库函数 - toupper()、tolower()、 isspace()
  • 用vue3显示websocket的状态
  • yum软件包乾坤大挪移(Yum Package Qiankun Great Migration)