Spring之bean的生命周期


  這篇博文是spring生命周期的詳解,目前限於作者自身的水平對於一些內容可能只知其然不知其所以然,所以博文中如果出現錯誤歡迎各位指出,同時我也會逐步提升自己的水平,爭取能夠多發布一些能讓大家獲益的博文。

  活不多少,先貼代碼。

  1,類文件

 person類用於演示bean生命周期的基礎類。 

package com.spring.beanlife.beans;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;


public class Person implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean {
    private String name;
    
    public Person(){
        System.out.println("無參數構造器");
    }
    
    public Person(String name){
        System.out.println("有參數構造器");
        name = this.name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("setName(String name) method run!!!!!");
        this.name = name;
    }
    
    public void sayHi() {
        System.out.println("hi " + name);
    }

    @Override
    /**
     *bean名稱關注接口可以通過該方法獲取到bean的id,xml中配置的bean的id
     */
    public void setBeanName(String arg0) {
        System.out.println("bean---------> " + arg0);        
    }

    @Override
    /**
     * bean工廠關注接口通過該方法可以獲取到beanfactory
     */
    public void setBeanFactory(BeanFactory arg0) throws BeansException {
        System.out.println(arg0);        
        
    }

    @Override
    /**
     * ApplicationContext關注接口通過該方法可以獲取到ApplicationContext
     */
    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        System.out.println(arg0);                
    }

    @Override
    /**
     * 調用afterPropertiesSet
     */
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet");
        
    }
    
    /**
     *@調用自定義的init方法 
     */
    public void init(){
        System.out.println("調用自定義的init方法");
    }
    
    /**
     *@調用自定義的destory方法 
     */
    public void destory(){
        System.out.println("調用自定義的destory方法");
    }
}
MyBeanPostProcessor實現了BeanPostProcessor后置處理器的類
package com.spring.beanlife.beans;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
        System.out.println("后置處理器的after方法");
        return arg0;
    }

    @Override
    public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
        System.out.println("后置處理器的before方法");
        return arg0;
    }

}

app測試生命周期的main函數方法

package com.spring.beanlife.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

import com.spring.beanlife.beans.Person;



public class App {

    public static void main(String[] args) {
        /*@通過核心容器的方式
         *
         */
        /*ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/spring/beanlife/beans.xml");
        Person person = (Person) applicationContext.getBean("person");
        person.sayHi();*/
        BeanFactory factory = new XmlBeanFactory(
                new ClassPathResource("com/spring/beanlife/beans.xml"));
        Person person = (Person) factory.getBean("person");
        person.sayHi();
    }

}

xml配置文件

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <bean id="person" init-method="init" destroy-method="destory" class="com.spring.beanlife.beans.Person">
        <property name="name" value="liukun" />
    </bean>
    <bean id="myBeanPostProcessor" class="com.spring.beanlife.beans.MyBeanPostProcessor" />
</beans>

 2,bean生命周期步驟(以AppliccationContext容器演示)

  1,實例化(當我們的程序加載beans.xml文件),把我們的bean(前提是scope=singlton)實例化到內存

  2,調用set方法設置屬性

  3,如果你實現了bean名字關注接口(BeanNameAware)則可以通過setBeanName獲取id號

  4,如果你實現了bean工廠關注接口(BeanFactoryAware)則可以通過setBeanFactory獲取BeanFactory

  5,如果你實現了ApplicationContextAware關注接口(ApplicationContextAware)則可以通過setApplicationContext獲取ApplicationContext

  6,如果bean和一個后置處理器關聯(BeanPostProcessor),則會調用postProcessBeforeInitialization(Before)方法

  7,如果你實現了InitializingBean關注接口(InitializingBean)則可以調用afterPropertiesSe

  8,如果自定義了初始化方法則調用自定義的初始化方法(注自定義初始化方法在bean中通過init-method方法配置)

  9,如果bean和一個后置處理器關聯(BeanPostProcessor),則會調用postProcessAfterInitialization(After)方法

   10,bean可以使用了

   11,容器關閉

   12,如果實現DisposableBean接口則可以調用其destory()方法,也可以定制自定義的銷毀方法(注自定義初始化方法在bean中通過init-method方法配置)

  ps:開發中常見操作步驟1>2>6>10>9>11 

  執行操作結果

  

利用BeanFactory操作執行的結果

 

結論:BeanFactory和ApplicationContext的生命周期不一樣,BeanFactory生命周期較為簡單,沒有使用到后置處理器的相關功能,以及沒有獲取核心容器相關方法。


免責聲明!

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



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