############Spring#############
Bean的生命周期是什么?
BeanFactory和FactoryBean的區別?
ApplicationContext和BeanFactory的區別?
BeanFactoryAware注解,還有什么其它的Aware注解
BeanFactoryAware方法和@Bean注解的方法執行順序
問題:Aware和@Bean
- 實例化 Bean @Bean 方法執行,返回 Bean 對象
Spring 會在解析配置類階段(ConfigurationClassPostProcessor)執行這個方法(@Bean的方法),返回一個 Bean 實例 - 屬性注入(依賴注入) 注入 @Autowired 字段或構造函數參數
- Aware 回調 執行 BeanNameAware, BeanFactoryAware, ApplicationContextAware 等
- 初始化回調 @PostConstruct / InitializingBean.afterPropertiesSet()
- 完成初始化 Bean 完成創建,交由容器使用
問題:@PostConstruct / InitializingBean.afterPropertiesSet()
特性 @PostConstruct InitializingBean.afterPropertiesSet()
所屬范疇 JSR-250 標準注解 Spring 特有接口
寫法簡潔 ? 是,注解方式,方法無參數 ? 否,需實現接口,覆蓋方法
執行時機 屬性注入完成后 屬性注入完成后
適合多個方法初始化? ? 支持多個 @PostConstruct 方法 ? 只能有一個 afterPropertiesSet() 方法
推薦程度 ? 推薦,優雅簡潔 ?? 次選,適合框架或基礎設施類使用
Bean 生命周期參與順序位置 執行在 Aware 接口回調之后 執行在 Aware 接口回調之后
問題:Bean生命周期
執行順序:
-
構造方法(Constructor)
-
依賴注入(字段、setter 方法)
-
Aware 接口(如 BeanNameAware、ApplicationContextAware)
-
@PostConstruct 方法
-
InitializingBean.afterPropertiesSet()
-
自定義 init-method(如果有)
-
BeanPostProcessor.postProcessBeforeInitialization() 初始化前后增強,多用于自動代理、AOP、動態注入
-
初始化完成
-
BeanPostProcessor.postProcessAfterInitialization()
-
Spring 容器完成刷新
-
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”);