Bean獲取與實例化
阿新 • • 發佈:2018-06-21
lang ati war 默認 ges IT 正在 web pos Bean獲取與實例化
ApplicationContext與BeanFactory關系
ApplicationContext它是擴展BeanFactory接口。
BeanFactory它采取延遲加載的方案,只有真正在getBean時才會實例化Bean
在開發中我們一般使用的是ApplicationContext,真正使用的是其實現類,
FileSystemXmlAppliCationContext 根據文件路徑獲取
ClassPathXmlApplicationContext 根據類路徑獲取
AppliCationContext它會在配置文件加載時,就會初始化Bean,並且ApplicationContext它提供不同的應用層的Context實現。例如在web開發中可以使用WebApplicationContext.
Bean的實例化方式無參數構造
對於這種方式,註意Bean類中必須提供無參數構造。
靜態工廠方法
需要創建一個工廠類,在工廠類中提供一個static返回bean對象的方法就可以。
實例工廠方法
需要創建一個工廠類,在工廠類中提供一個非static的創建bean對象的方法,在配置文件中需要將工廠配置,還需要配置bean
Bean的作用域
在bean聲明時它有一個scope屬性,它是用於描述bean的作用域。
可取值有:
singleton:單例 代表在spring ioc容器中只有一個Bean實例 (默認的scope)
prototype多例 每一次從spring容器中獲取時,都會返回一個新的實例
request 用在web開發中,將bean對象request.setAttribute()存儲到request域中
session 用在web開發中,將bean對象session.setAttribute()存儲到session域中
在開如常用的值是singleton與prototype
Bean的生命周期
ApplicationContext與BeanFactory關系
ApplicationContext它是擴展BeanFactory接口。
BeanFactory它采取延遲加載的方案,只有真正在getBean時才會實例化Bean
在開發中我們一般使用的是ApplicationContext,真正使用的是其實現類,
FileSystemXmlAppliCationContext 根據文件路徑獲取
ClassPathXmlApplicationContext 根據類路徑獲取
AppliCationContext它會在配置文件加載時,就會初始化Bean,並且ApplicationContext它提供不同的應用層的Context實現。例如在web開發中可以使用WebApplicationContext.
對於這種方式,註意Bean類中必須提供無參數構造。
靜態工廠方法
需要創建一個工廠類,在工廠類中提供一個static返回bean對象的方法就可以。
實例工廠方法
需要創建一個工廠類,在工廠類中提供一個非static的創建bean對象的方法,在配置文件中需要將工廠配置,還需要配置bean
Bean的作用域
在bean聲明時它有一個scope屬性,它是用於描述bean的作用域。
可取值有:
singleton:單例 代表在spring ioc容器中只有一個Bean實例 (默認的scope)
prototype多例 每一次從spring容器中獲取時,都會返回一個新的實例
request 用在web開發中,將bean對象request.setAttribute()存儲到request域中
在開如常用的值是singleton與prototype
Bean的生命周期
- instantiate bean對象實例化
- populate properties 封裝屬性
- 如果Bean實現BeanNameAware執行setBeanName
- 如果Bean實現BeanFactoryAwar或ApplicationContextAwar設置工廠setBeanFactory或上下文對象setApplicationContext
- 如果存在類實現BeanPostProcessor(後處理Bean),執行postProcessBeforeInitialization
- 如果Bean實現InitializingBean執行afterPropertiesSet
- 調用自定義的init-method方法
- 如果存在類實現BeanPostProcessor(處理Bean),執行postProcessAfterInitialization
- 執行業務處理
- 如果Bean實現DisposableBean執行destroy
- 調用自定義的destroy-method
對於bean的生命周期方法:
第三步與第四步是讓Bean了解spring容器。
第五步與第八步 可以針對指定的Bean進行功能增強,這時一般會使用動態代理.
第六步與第十步:通過實現指定的接口來完成init與destroy操作
但是在開發中一般不使用第6步與第10步,原因是我們可以使用第7步與第11步來完成。
第7步與第11步的初始化與銷毀操作它無耦合,推薦使用的。但是必須在配置文件中指定初始化與銷毀的方法
總結:
對於bean的生命周期,我們需要關註的主要有兩個方法: - 增強bean的功能可以使用後處理Bean, BeanPostProcessor
- 如果需要初始化或銷毀操作我們可以使用init-method destroy-method
註意:destroy-method只對scope=singleton有效果。
Bean的屬性註入
在spring中bean的屬性註入有兩種
構造器註入
Setter方法註入
關於ref屬性作用
使用ref來引入另一個bean對象,完成bean之間註入
集合屬性的註入
在spring中對於集合屬性,可以使用專門的標簽來完成註入例如:list set map properties等集合元素來完成集合屬性註入.
List屬性註入
如果屬性是數組類型也可以使用list完成註入
Set屬性註入
Map屬性註入
Properties屬性註入
Java.util.Properties是java.utilsMap的實現類,它的key與value都是String類型.
名稱空間p和c的使用
Spring2.0以後提供了xml命名空間。
P名稱空間
C名稱空間
首先它們不是真正的名稱空間,是虛擬的。它是嵌入到spring內核中的。
使用p名稱空間可以解決我們setter註入時<property>簡化
使用c名稱空間可以解決我們構造器註入時<constructor-arg>簡化
使用setter註入
在applicationContext.xml文件中添加p名稱空間簡化setter註入
使用c名稱空間來解決構造器註入
在applicationContext.xml文件中添加c名稱空間
註:如果c或p名稱空間操作的屬性後綴是”-ref”代表要引入另一個已經存在的bean,例如
SpEl
spring expression language 是在spring3.0以後的版本提供
它類似於ognl或el表達式,它可以提供在程序運行時構造復雜表達式來完成對象屬性存儲及方法調用等。
Spel表達式的格式 #{表達式}
示例1:完成bean之間的註入
示例2 支持屬性調用及方法調用
Bean獲取與實例化