Spring來一發(二)Bean的管理
1、Bean的初始化
Spring中Bean的初始化是在ApplicationContext應用上下文載入的時候實現的,Spring通過兩種方式可以發現需要初始化的Bean,一種方式是加@Bean註解,另一種是在xml種定義Bean。
在啟動web容器時,ContextLoaderListener建立ApplicationContext時會載入applicationContext.xml,在這個xml中會配置classpath*:spring/*.xml,這樣就可以載入所有的Spring相關xml中的Bean。
2、Bean的裝配方式
在Spring容器中拼湊Bean叫做裝配,裝配Bean的時候,容器需要知道有哪些Bean以及容器如何使用依賴注入將它們配合在一起。裝配方式有三種:
-
在XML中進行顯式配置;
-
在Java中進行顯式配置;
-
隱式的bean發現機制和自動裝配(通過註解等方式);
Spring中可以利用註解@Autowired、@Resource實現自動裝配,通過配置元件掃描(component scanning)讓spring自動發現上下文中所建立的bean,掃描到@Component、@Service註解的bean。有些場景是無法應用自動裝配的,如第三方庫的元件,原因是這些元件不是本地的,無法被容器自動發現。
3、Bean的生命週期
Bean從建立到銷燬:
-
Bean的建立, 由BeanFactory讀取Bean定義檔案,並生成各個例項;
-
Setter注入,執行Bean的屬性依賴注入;
-
BeanNameAware的setBeanName(), 如果實現該介面,則執行其setBeanName方法;
-
BeanFactoryAware的setBeanFactory(),如果實現該介面,則執行其setBeanFactory方法;
-
BeanPostProcessor的processBeforeInitialization(),如果有關聯的processor,則在Bean初始化之前都會執行這個例項的processBeforeInitialization()方法;
-
InitializingBean的afterPropertiesSet(),如果實現了該介面,則執行其afterPropertiesSet()方法;
-
Bean定義檔案中定義init-method;
-
BeanPostProcessors的processAfterInitialization(),如果有關聯的processor,則在Bean初始化之前都會執行這個例項的processAfterInitialization()方法;
-
DisposableBean的destroy(),在容器關閉時,如果Bean類實現了該介面,則執行它的destroy()方法;
-
Bean定義檔案中定義destroy-method,在容器關閉時,可以在Bean定義檔案中使用“destory-method”定義的方法。