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");

相关推荐
NE_STOP8 分钟前
SpringBoot--简单入门
java·spring
hqxstudying35 分钟前
Java创建型模式---原型模式
java·开发语言·设计模式·代码规范
Dcs1 小时前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
保持学习ing1 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者1 小时前
Java的SPI机制详解
java
超级小忍2 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug2 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享2 小时前
Java Lombok 入门
java
程序无bug2 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队2 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端