BeanDefinition
BeanDefinition 表示 Bean 定義:
- Spring根據BeanDefinition來創建Bean對象;
- BeanDefinition有很多的屬性用來描述Bean;
- BeanDefiniton是Spring中非常核心的概念。
- BeanDefiniton中重要的屬性:
a. beanClass:表示一個bean的類型,比如:UserService.class、OrderService.class,Spring在創建Bean的過程中會根據此屬性來實例化得到對象;
b. scope:表示一個作用域(Spring中有五種作用域),比如:singleton、prototype分別標識單例Bean、原型Bean;
c. isLazy:表示一個Bean是不是需要懶加載,原型bean和isLazy屬性不起作用,懶加載的單例bean,會在第一次getBean的時候生成該bean,非懶加載的單例bean,則會在spring啟動的過程中直接生成好;
d. dependsOn:表示一個bean在創建之前所依賴的其他bean得先全部創建好;
e. primary:表示一個bean是主bean,在spring中一個類型可以有個bean對象,在進行依賴注入時,如果根據類型找到了多個bean,此時會判斷這些bean中是否存在一個主bean,如果存在,則直接將這個bean注入給屬性;
f. initMethodName:表示一個bean的初始化方法,一個bean的生命周期過程中有一個步驟叫初始化,spring會在這個步驟中去調用bean的初始化方法,初始化邏輯由程序員自己控制,表示程序員可以自定義邏輯對bean進行加工。
Spring中的五種作用域
- singleton:在spring IoC容器僅存在一個Bean實例,Bean以單例方式存在,默認值
- prototype:每次從容器中調用Bean時,都返回一個新的實例,即每次調用getBean()時,相當于執行newXxxBean()
- request:每次HTTP請求都會創建一個新的Bean,該作用域僅適用于WebApplicationContext環境
- session:同一個HTTP Session共享一個Bean,不同Session使用不同的Bean,僅適用于WebApplicationContext環境
- globalession:一般用于Portlet應用環境,該作用域僅適用于WebApplicationContext環境
BeanFactory
- BeanFacory 是一種Spring容器;
- BeanFacory 直譯過來就是Bean工廠,它可以用來創建Bean、獲取Bean;
- BeanFactory是Spring中非常核心的組件。
FactoryBean 和 BeanFactory 區別?
- BeanFactory:Bean工廠,是一個工廠(Factory),Spring IoC容器 的最高層接口就是BeanFactory,它的作用是管理Bean,即實例化、定 位、配置應用程序中的對象及建立這些對象之間的依賴。
- FactoryBean:工廠Bean,是一個Bean,作用是產生其他Bean實 例。這種Bean沒有什么特別的要求,僅需要提供一個工廠方法,該方法 用來返回其他 Bean 實例。在通常情況下,Bean 無須自己實現工廠模 式,Spring容器擔任工廠的角色;在少數情況下,容器中的Bean本身就 是工廠,其作用是產生其他Bean實例。 當用戶使用容器時,可以使用轉義字符“&”來得到FactoryBean本 身,以區別通過FactoryBean產生的實例對象和FactoryBean對象本身。 在BeanFactory中通過如下代碼定義了該轉義字符:FACTORY_BEAN_PREFIX = “&”
BeanDefiniton、BeanFactory、Bean對象之間的關系?
- BeanFactory將利用BeanDefinition來創建Bean對象;
- BeanDefinition相當于原材料、Bean對象相當于生產出來的產品,BeanFactory相當于工廠;
BeanFactory核心子接口和實現類
- ListableBeanFactory:它可以枚舉所有 bean 實例,而不是按照客戶的要求逐個嘗試按名稱查找 bean。預加載所有 bean 定義的 BeanFactory 實現可以實現此接口。
- ConfigurableBeanFactory:大多數bean工廠要實現的配置接口。除了BeanFactory 接口方法之外,還提供了配置 bean 工廠的工具。
- AutowireCapableBeanFactory:由能夠自動裝配的 bean 工廠實現,前提是他們希望為現有的 bean 實例公開此功能。
- AbstractBeanFactory:抽象基類,提供 ConfigurableBeanFactory SPI 的全部功能。也可以用作 bean 工廠實現的基類,這些實現可以從 resource 資源獲取 bean 定義。
- DefaultListableBeanFactory:核心實現類
Bean的生命周期
- Bean生命周期用來描述Spring中一個Bean創建、銷毀過程中所經歷的步驟,其中Bean創建過程是重點。
- 可以利用Bean生命周期機制對Bean進行自定義加工。
核心步驟
- BeanDefintion
- 構造方法推斷
- 實例化(反射)
- 屬性填充
- 初始化
- 初始化后