天天看點

【Spring IOC容器】Bean的生命周期

文章目錄

  • ​​Bean的生命周期​​
  • ​​一、概念​​
  • ​​二、bean的生命周期​​
  • ​​三、示範bean的生命周期​​
  • ​​Ⅰ.建立Orders類​​
  • ​​Ⅱ.修改配置檔案​​
  • ​​Ⅲ.編寫測試類​​
  • ​​四、Bean 的後置處理器,bean 生命周期有七步​​
  • ​​▶ 示範添加後置處理器效果​​
  • ​​(1)建立類,實作接口 BeanPostProcessor,建立後置處理器​​
  • ​​(2)修改配置檔案​​
  • ​​五、Bean的生命周期 單例與多例 模式的對比​​

Bean的生命周期

一、概念

  • 簡單的一句話來說bean的生命周期就是從對象建立到對象銷毀的過程。

二、bean的生命周期

(1)通過構造器建立 bean 執行個體(​

​無參數構造​

​)

(2)為 bean 的屬性設定值和對其他 bean 引用(​

​調用 set 方法​

​)

(3)調用 bean 的初始化的方法(​

​進行配置初始化的方法​

​)

(4)bean 可以使用了(​

​對象擷取​

​)

(5)當容器關閉時候,調用 bean 的銷毀的方法(​

​進行配置銷毀的方法​

​)

三、示範bean的生命周期

Ⅰ.建立Orders類

  • 聲明屬性
  • 編寫無參構造器
  • 編寫set()方法
  • 建立初始化方法
  • 建立bean銷毀方法
public class Orders {
    // 聲明屬性
    private String oName;

    // 1.無參構造
    public Orders() {
        System.out.println("第一步:執行無參構造器建立bean執行個體");
    }

    // 2.set
    public void setoName(String oName) {
        this.oName = oName;
        System.out.println("第二步:調用set方法設定屬性的值");
    }

    // 3.建立執行的初始化的方法 --- 在xml檔案中配置
    public void initMethod() {
        System.out.println("第三步:執行初始化的方法");
    }

    // 5.建立執行的bean銷毀方法
    public void destroyMethod() {
        System.out.println("第五步:執行銷毀方法");
    }
}      

Ⅱ.修改配置檔案

  • 配置建立bean對象
  • 添加​

    ​init-method屬性​

    ​,指定初始化方法
  • 添加​

    ​destroy-method屬性​

    ​,指定銷毀bean的方法
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置bean對象  -->
    <bean id="oders" class="Bean的生命周期.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oName" value="電腦"></property>
    </bean>
</beans>      

Ⅲ.編寫測試類

public class Test {
    @org.junit.Test
    public void test_orders(){
        try {
            ApplicationContext context = new ClassPathXmlApplicationContext("Bean的生命周期/bean_Orders.xml");
            // 4.擷取bean執行個體對象
            Orders orders = context.getBean("orders",Orders.class);
            System.out.println("第四步:擷取建立的bean執行個體對象");
            // 5.手動銷毀bean執行個體對象
            ((ClassPathXmlApplicationContext)context).close();
        } catch (Exception e){
            e.getMessage();
        }
    }
}      
【Spring IOC容器】Bean的生命周期

​​傳回頂部​​

四、Bean 的後置處理器,bean 生命周期有七步

(1)通過構造器建立 bean 執行個體(​

​無參數構造​

​)

(2)為 bean 的屬性設定值和對其他 bean 引用(​

​調用 set 方法​

​)

  • 把 bean 執行個體傳遞 bean 後置處理器的方法 ​

    ​postProcessBeforeInitialization​

(3)調用 bean 的初始化的方法(​

​進行配置初始化的方法​

​)

  • 把 bean 執行個體傳遞 bean 後置處理器的方法 ​

    ​postProcessAfterInitialization​

(4)bean 可以使用了(​

​對象擷取​

​)

(5)當容器關閉時候,調用 bean 的銷毀的方法(​

​進行配置銷毀的方法​

​)

▶ 示範添加後置處理器效果

(1)建立類,實作接口 BeanPostProcessor,建立後置處理器

public class MyBeanPost implements BeanPostProcessor {
    /**
     * 初始化之前調用
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("在初始化之前執行的方法");
        return bean;
    }

    /**
     * 初始化之後調用
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("在初始化之後執行的方法");
        return bean;
    }
}      

(2)修改配置檔案

  • 隻需要配置後置處理器類的bean對象即可,因為後置處理器類實作了​

    ​BeanPostProcessor接口​

    ​實作了後置處理器,那麼後置處理器就會對目前配置檔案中的所有bean都添加後置處理器的處理。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置bean對象  -->
    <bean id="orders" class="Bean的生命周期.Orders" init-method="initMethod" destroy-method="destroyMethod">
        <property name="oName" value="電腦"></property>
    </bean>
    <!-- 配置後置處理器  -->
    <bean id="myBeanPost" class="Bean的生命周期.Test.MyBeanPost"></bean>
</beans>      
【Spring IOC容器】Bean的生命周期

五、Bean的生命周期 單例與多例 模式的對比

圖一:

【Spring IOC容器】Bean的生命周期

圖二:

【Spring IOC容器】Bean的生命周期

圖三:

【Spring IOC容器】Bean的生命周期

圖四:

【Spring IOC容器】Bean的生命周期
注意:不管後面有沒有建立明确的對象,都會執行配置檔案的方法和屬性,因為以上是預設的單例模式(設定 scope 值是 singleton 時候),​

​加載 spring 配置檔案時候就會建立單執行個體對象​

​;多例模式(設定 scope 值是 prototype 時候),​

​不是在加載 spring 配置檔案時候建立 對象,而是在調用getBean方法時候建立多執行個體對象​

​,是以兩者的生命周期有所不一樣!
  • 取值有三個​

    ​default ,true ,false​

  • 定義:
  • 當容器建立時就将對象也一起建立,就是非懶加載
  • 當我們需要使用改對象才加載的時候,就是懶加載
  • 優點:節省資源
  • 缺點:bug不容易暴露,需要到使用的時候才會發現要使用的類有問題
  • 單例模式預設非懶加載
  • 多例模式為懶加載