Spring 核心:Bean 的生命周期、創建方式、注入邏輯與作用域詳解
引言
Spring框架以其控制反轉(IOC)與面向切面編程(AOP)的核心思想,徹底改變了傳統應用的開發模式 —— 它將對象的創建、依賴管理與生命周期控制權從業務代碼中剝離,交給容器統一調度,從而實現組件解耦、代碼簡化與架構彈性。而這一切強大能力的載體,正是Spring Bean。
本文將從Bean的完整生命周期出發,系統拆解其從元數據定義到資源銷毀的全流程節點,詳解多樣化的創建方式與依賴注入邏輯,剖析不同作用域的適用場景。
生命周期

元數據定義
通過XML、注解或Java配置,解析Bean的類信息、依賴關系、生命周期方法等,生成BeanDefinition并存儲于BeanDefinitionMap。
實例創建
基于BeanDefinition,通過反射或工廠方法生成Bean對象,默認依賴無參構造器,核心邏輯在createBeanInstance方法中實現。
依賴注入
為Bean填充屬性或注入依賴Bean,支持多種注入方式,循環依賴通過三級緩存解決,對應populateBean方法。
容器上下文關聯
若Bean實現Aware系列接口(如BeanNameAware、ApplicationContextAware),容器會回調接口方法注入相關對象,觸發于initializeBean階段。
前置處理
自定義BeanPostProcessor的postProcessBeforeInitialization方法生效,可實現注解解析、上下文適配等功能。
初始化執行
先調用InitializingBean接口的afterPropertiesSet方法,再執行自定義init-method(如@Bean指定的初始化方法),由invokeInitMethods方法驅動。
后置處理
BeanPostProcessor的postProcessAfterInitialization方法執行,典型應用是AOP代理創建,完成Bean的最終優化。
銷毀注冊
對實現DisposableBean或指定銷毀方法的Bean,注冊銷毀回調,確保容器關閉時資源可回收。
實際使用
Bean完成所有初始化后,通過@Autowired或getBean()獲取,進入可用狀態。
資源銷毀
容器關閉時,觸發DisposableBean的destroy方法、@PreDestroy注解方法或自定義銷毀方法,釋放數據庫連接、文件句柄等資源。
?
整個生命周期中,AbstractAutowireCapableBeanFactory負責創建與初始化核心流程,DisposableBeanAdapter主導銷毀階段的資源清理。
創建方式
組件掃描自動注冊
通過@Component、@Service、@Repository、@Controller等注解標記類,配合@ComponentScan(注解)或context:component-scan(XML),容器啟動時自動掃描并注冊Bean。
配置類顯式定義
在@Configuration標注的配置類中,通過@Bean注解自定義Bean的創建邏輯,適用于需要復雜初始化或依賴管理的場景。
XML 配置聲明
傳統創建方式,通過<bean>標簽指定類路徑、屬性等信息,適合遺留項目或非注解兼容場景,需通過ClassPathXmlApplicationContext加載配置。
@Import 快速導入
直接通過@Import注解導入目標類,無需額外標注組件注解,即可將類納入IOC容器管理,簡化配置流程。
自定義注解驅動
通過自定義注解(如Dubbo的@DubboService),結合BeanDefinitionRegistryPostProcessor等處理器,掃描指定包路徑,解析注解屬性并生成BeanDefinition。
運行時動態注冊
在程序運行中,通過BeanDefinitionRegistry手動構建GenericBeanDefinition,指定Bean類及屬性,調用registerBeanDefinition方法完成動態注冊,適配插件化、動態配置場景。
注入方式
@Autowired 注解注入
Spring原生注解,支持三種注入形式:字段注入(直接標注屬性)、構造方法注入(標注構造器,4.3+單構造器可省略注解)、setter方法注入(標注setter方法)。
標準注解注入
JDK的@Resource(按名稱匹配優先)和Java EE的@Inject(需導入相關依賴),可替代@Autowired實現跨框架兼容的注入。
XML 配置注入
通過<constructor-arg>(構造方法注入)和<property>(屬性注入)標簽,在XML文件中聲明依賴關系,無需代碼注解。
隱式構造注入
Spring 4.3后,若類僅含一個構造器,無需標注任何注解,容器會自動通過該構造器注入所需依賴Bean。
作用域分類與應用場景
單例(Singleton)
默認作用域,容器內僅創建一個Bean實例,啟動時初始化、關閉時銷毀,適用于無狀態組件(如工具類、緩存管理器),需注意可變狀態的線程安全問題。
原型(Prototype)
每次獲取Bean(注入或 getBean())時創建新實例,容器不管理銷毀過程,適合有狀態對象(如用戶臨時數據、會話相關實例)。
請求域(Request)
Web環境專屬,每個HTTP請求對應一個Bean實例,請求結束后銷毀,用于存儲請求級別的上下文信息(如請求日志)。
會話域(Session)
Web環境專屬,每個HttpSession對應一個實例,會話失效時銷毀,適用于用戶會話數據(如購物車、登錄狀態)。
應用域(Application)
Web環境專屬,綁定ServletContext,應用啟動時創建、關閉時銷毀,用于全局共享資源(如應用配置、全局緩存)。
WebSocket 域(WebSocket)
WebSocket應用專屬,連接建立時創建實例,連接關閉時銷毀,適配實時通信場景的狀態管理。
自定義作用域
實現org.springframework.beans.factory.config.Scope接口,重寫Bean的獲取、移除、銷毀回調等方法,通過registerScope注冊到容器,滿足特殊場景需求。






























