IOC容器Bean的例項化方式以及其生命週期(上)
阿新 • • 發佈:2019-02-12
1. 三種例項化Bean的方式
a.使用類構造器例項化(預設無引數)
<bean id=“personService" class="com.baidu..PersonServiceImpl"/>
b.使用靜態工廠方法例項化(簡單工廠模式)
<bean id="personService" class="com.baidu.factory.PersonServiceFactory" factory-method="createPersonService" /> public class PersonServiceFactory { public static PersonService createPersonService(){ return new PersonServiceImpl(); } }
c.使用例項工廠方法例項化(工廠方法模式):
<bean id=“personServiceFactory" class="com.baidu.factory.PersonServiceFactory"/> <bean id="personService" factory-bean=“personServiceFactory" factory-method="createPersonService" /> public class PersonServiceFactory { public PersonService createPersonService(){ return new PersonServiceImpl(); } }
Bean的命名 id屬性和name屬性
- 一般情況下,裝配一個Bean時,通過指定一個id屬性作為Bean的名稱
- id 屬性在IoC容器中必須是唯一的
- id 的命名要滿足XML對ID屬性命名規範,必須以字母開始,可以使用字母、數字、連字元、下劃線、句號、冒號
注意:
如果Bean的名稱中含有特殊字元,就需要使用name屬性。
例如:<bean name="#person" class="com.baidu.pojo.Person"/
>
因為name屬性可以相同,所以後出現Bean會覆蓋之前出現的同名的Bean
Bean的作用域
Spring容器中Bean的生命週期
<bean id=“foo” class=“...Foo” init-method=“setup” destory-method=“teardown”/>
注意
當bean被載入到容器的時候呼叫setup
當bean從容器中刪除的時候呼叫teardown(scope= singleton有效)
- instantiate bean物件例項化
- populate properties 封裝屬性
- 如果Bean實現BeanNameAware 執行 setBeanName
- 如果Bean實現BeanFactoryAware 或者 ApplicationContextAware 設定工廠 setBeanFactory 或者上下文物件 setApplicationContext
- 如果存在類實現 BeanPostProcessor(後處理Bean) ,執行postProcessBeforeInitialization
- 如果Bean實現InitializingBean 執行 afterPropertiesSet
- 呼叫 指定初始化方法 init
- 如果存在類實現 BeanPostProcessor(處理Bean) ,執行postProcessAfterInitialization
- 執行業務處理
- 如果Bean實現 DisposableBean 執行 destroy
- 呼叫 指定銷燬方法 customerDestroy