Spring常见问题复习

############Spring#############

Bean的生命周期是什么?

BeanFactory和FactoryBean的区别?

ApplicationContext和BeanFactory的区别?

BeanFactoryAware注解,还有什么其它的Aware注解

BeanFactoryAware方法和@Bean注解的方法执行顺序

问题:Aware和@Bean

  1. 实例化 Bean @Bean 方法执行,返回 Bean 对象
    Spring 会在解析配置类阶段(ConfigurationClassPostProcessor)执行这个方法(@Bean的方法),返回一个 Bean 实例
  2. 属性注入(依赖注入) 注入 @Autowired 字段或构造函数参数
  3. Aware 回调 执行 BeanNameAware, BeanFactoryAware, ApplicationContextAware 等
  4. 初始化回调 @PostConstruct / InitializingBean.afterPropertiesSet()
  5. 完成初始化 Bean 完成创建,交由容器使用

问题:@PostConstruct / InitializingBean.afterPropertiesSet()

特性 @PostConstruct InitializingBean.afterPropertiesSet()

所属范畴 JSR-250 标准注解 Spring 特有接口

写法简洁 ✅ 是,注解方式,方法无参数 ❌ 否,需实现接口,覆盖方法

执行时机 属性注入完成后 属性注入完成后

适合多个方法初始化? ✅ 支持多个 @PostConstruct 方法 ❌ 只能有一个 afterPropertiesSet() 方法

推荐程度 ✅ 推荐,优雅简洁 ⚠️ 次选,适合框架或基础设施类使用

Bean 生命周期参与顺序位置 执行在 Aware 接口回调之后 执行在 Aware 接口回调之后

问题:Bean生命周期

执行顺序:

  1. 构造方法(Constructor)

  2. 依赖注入(字段、setter 方法)

  3. Aware 接口(如 BeanNameAware、ApplicationContextAware)

  4. @PostConstruct 方法

  5. InitializingBean.afterPropertiesSet()

  6. 自定义 init-method(如果有)

  7. BeanPostProcessor.postProcessBeforeInitialization() 初始化前后增强,多用于自动代理、AOP、动态注入

  8. 初始化完成

  9. BeanPostProcessor.postProcessAfterInitialization()

  10. Spring 容器完成刷新

  11. ApplicationRunner / CommandLineRunner 的 run() 方法 Spring 容器完全启动后,启动后逻辑、预热缓存、拉取远端配置等

    Bean 构建过程

    ┌───────────────────────────┐

    │ 构造函数 │

    │ 依赖注入(@Autowired) │

    │ Aware 接口回调(xxxAware)│

    │ @PostConstruct │

    │ InitializingBean / init() │

    │ BeanPostProcessor.before │

    │ --- Bean 初始化完成 --- │

    │ BeanPostProcessor.after │

    └───────────────────────────┘

    复制代码
     容器启动完成后

┌────────────────────────────┐

│ ApplicationRunner / │

│ CommandLineRunner.run() │

└────────────────────────────┘

问题:BeanFactory和ApplicationContext(增强)

项目 BeanFactory(原始) ApplicationContext(增强)

定义 最基本的 IOC 容器接口 BeanFactory 的子接口,功能更丰富

初始化时机 懒加载:按需创建 Bean 预初始化:容器启动时就创建单例 Bean

适合场景 内存敏感、轻量级框架 企业开发、功能完整的应用

是否支持国际化 否 是(有 MessageSource)

是否支持事件机制 否 是(ApplicationEventPublisher)

是否支持 AOP、注解 否 是(自动处理 @Autowired 等)

是否支持 @PostConstruct 等生命周期管理 否 是

BeanFactory 是懒加载:调用 getBean() 时才真正创建 Bean

能力 BeanFactory ApplicationContext

自动注入(@Autowired 等) ❌ ✅

事件发布与监听(ApplicationEvent) ❌ ✅

国际化支持 ❌ ✅

环境变量访问(Environment) ❌ ✅

Bean 后处理器(BeanPostProcessor 自动注册) ❌ ✅

BeanFactory

├── ListableBeanFactory

│ ↑

│ HierarchicalBeanFactory

│ ↑

│ ApplicationContext(重点)

BeanFactory 是 Spring 最原始的容器,ApplicationContext 是功能齐全的高级容器。

在 Spring Boot 中,默认用的就是 ApplicationContext(比如 AnnotationConfigApplicationContext)。

问题:BeanFactory和FactoryBean的区别?

BeanFactory:Spring 的 容器接口,负责管理和创建 Bean。

FactoryBean:你定义的一个 工厂 Bean,用于自定义创建某个对象的方式。

FactoryBean 是你定义的一个 Bean,用来创建其他 Bean。Spring 会调用它的 getObject() 方法返回真正的 Bean。

你可以用它来封装复杂对象的创建逻辑(如代理对象、单例池对象、适配第三方库对象等)。

// 加个 & 前缀,表示获取工厂 Bean 本身

MyFactoryBean factoryBean = (MyFactoryBean) context.getBean("&myBean");

相关推荐
tsyjjOvO几秒前
JDBC(Java Database Connectivity)
java·数据库
qq_12498707535 分钟前
基于springboot的尿毒症健康管理系统的设计与实现(源码+论文+部署+安装)
java·spring boot·spring·毕业设计·计算机毕业设计
黎子越40 分钟前
python相关练习
java·前端·python
电商API&Tina44 分钟前
电商数据采集 API 接口 全维度解析(技术 + 商业 + 合规)
java·大数据·开发语言·数据库·人工智能·json
liwulin05061 小时前
【JSON】使用com.fasterxml.jackson解析json字符串
java·数据库·json
what丶k1 小时前
深度解析:以Kafka为例,消息队列消费幂等性的实现方案与生产实践
java·数据结构·kafka
星火开发设计1 小时前
C++ 输入输出流:cin 与 cout 的基础用法
java·开发语言·c++·学习·算法·编程·知识
毕设源码-邱学长1 小时前
【开题答辩全过程】以 基于Springboot的酒店住宿信息管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
仟濹2 小时前
【Java加强】1 异常 | 打卡day1
java·开发语言·python
AllData公司负责人2 小时前
【亲测好用】实时开发平台能力演示
java·c语言·数据库