Spring Bean的生命周期及其應用


一、什么是Bean?

In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.

Bean是一個由Spring IoC容器實例化、組裝和管理的對象,bean就是一個實例。

 

二、Bean 的完整生命周期

Bean從創建-參與計算流程-銷毀,spring通過IOC控制翻轉進行操作,所以bean的整個生命周期都會暴露操作實例的方法,通過這些方法,可以更加靈活的操控每個實例對象。

下面展示了一個Bean的構造過程

深究Spring中Bean的生命周期

Bean 的生命周期

  1. Spring啟動,查找並加載需要被Spring管理的bean,進行Bean的實例化,配置文件中<bean>表示一個bean,也可以使用各種注解

  2. 然后對Bean在文件或注解中設置的屬性等進行注入;

  3. 如果Bean實現了BeanNameAware接口,Spring將Bean的Id傳遞給setBeanName()方法,此處可以重新修改beanName;

  4. 如果Bean實現了BeanFactoryAware接口,Spring將調用setBeanFactory()方法,將BeanFactory容器實例傳入;

  5. 如果Bean實現了ApplicationContextAware接口,Spring將調用Bean的setApplicationContext()方法,將bean所在應用上下文引用傳入進來。

  6. 如果Bean實現了BeanPostProcessor接口,Spring就將調用他們的postProcessBeforeInitialization()方法。

  7. 如果Bean 實現了InitializingBean接口,Spring將調用他們的afterPropertiesSet()方法。類似的,如果bean使用init-method聲明了初始化方法,該方法也會被調用

  8. 如果Bean 實現了BeanPostProcessor接口,Spring就將調用他們的postProcessAfterInitialization()方法。

  9. 此時,Bean已經准備就緒,可以被應用程序使用了。他們將一直駐留在應用上下文中,直到應用上下文被銷毀。

  10. 如果bean實現了DisposableBean接口,Spring將調用它的destory()接口方法,同樣,如果bean使用了destory-method 聲明銷毀方法,該方法也會被調用。

記憶方法:數豬名 工廠上下 初始化四階段 系統自我銷毀 

三、生命周期中函數在開發中有什么用

我以前看到bean的生命周期的時候只是簡單的記住它的順序,感覺沒什么用,真的是to yong to simple;

1.屬性注入

<bean id="car1" class="com.demo.Car">
        <property name="name" value="寶馬"></property>
        <property name="price" value="100000"></property>
</bean>

這樣在car的類中有一個

public Car(String name,double price){
    this.name=name;
    this.price=price;
}

就可以實現一個設置好初始值得一個bean

2.BeanNameAware接口,有一個setBeanName方法

可以在類中新建一個String beanName變量,通過setBeanName進行復制,這樣就可以知道這個bean的Name,

上面的id="car1" 也會通過這個setBeanName傳入到實例中;

3.BeanFactoryAware接口,可以獲得創建這個實例的工廠方法

BeanFactory  可以獲得或者設置類
String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String var1) throws BeansException;

    <T> T getBean(String var1, Class<T> var2) throws BeansException;

    <T> T getBean(Class<T> var1) throws BeansException;

    Object getBean(String var1, Object... var2) throws BeansException;

    boolean containsBean(String var1);

    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;

    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;

    String[] getAliases(String var1);

4.ApplicationContextAware  可以獲得ApplicationContext 上下文,

applicationContext.getBeansOfType(RegistryConfig.class
applicationContext可以通過getBeansOfType獲得所有已經繼承RegistryConfig這個配置文件的實例Map,
Map的key是beanName value是對應的實例,這樣這個類需要什么配置就能很好的確定

5.BeanPostProcessor接口的postProcessBeforeInitialization 、postProcessAfterInitialization

是在系統初始化和自定義初始化之前和之后的一些處理方法,針對所有Spring上下文中所有的bean,
可以在配置文檔applicationContext.xml中配置一個BeanPostProcessor,

然后對所有的bean進行一個初始化之前和之后的代理



6.InitializingBean接口,afterPropertiesSet是系統的初始化方法,此處可以對父類做一些基本的初始化
7.調用自己定義的初始化方法
<bean id="beanA"  class="classA"  init-method="anotherInit">

</bean>

init-method 配置的初始化方法

8.DisposableBean 系統銷毀時調用的方法

9.自定義銷毀方法:

<bean class="com.demo" init-method="start" destroy-method="destroy">
</bean>

destroy-method方法

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM