天天看點

Spring總結——Bean的生命周期Bean的生命周期

文章目錄

  • Bean的生命周期
    • 加載方式|lazy-init屬性
    • Bean的初始化和銷毀

Bean的生命周期

加載方式|lazy-init屬性

用于設定Spring容器加載對象的方式,有兩種方式:

立即加載:

  • lazy-init="false"

    或者不寫
  • lazy-init="default"

spring容器一啟動,會解讀

ApplicationContext.xml

檔案,不管你是不是要使用該bean,都會先建立對象。這會造成啟動的時候,特别的慢。但是,也是最保險的方法。

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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 定義兩個bean隻用一個 -->
	<bean id="f" class="com.jp.domain.Person" lazy-init="false"></bean>
	<bean id="p" class="com.jp.domain.Person" lazy-init="false"></bean> 
</beans>
           

代碼

public class Demo {
	/*
	 * Spring通過預設的構造函數建立對象
	 */
	@Test
	public void test1(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Object bean = ac.getBean("p");
		Person p = (Person) bean;
		System.out.println(p);
	}
}
           

延時加載:

  • lazy-init="true"

    當spring容器調用getBean方法時,對象才建立出來。

據說,在spring設定lazy-init=true的情況下,一個應用可以從 55 秒下降到 8 秒

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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<!-- 定義兩個bean隻用一個 -->
	<bean id="f" class="com.jp.domain.Person" lazy-init="true"></bean>
	<bean id="p" class="com.jp.domain.Person" lazy-init="true"></bean> 
</beans>
           

代碼同上

Bean的初始化和銷毀

init-method屬性

調用初始化方法

destroy-method屬性

調用銷毀方法

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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="p" class="com.jp.domain.Person" lazy-init="false" init-method="init" destroy-method="destory"></bean>

</beans>
           

代碼

public class Demo {
	
	/*
	 * Bean對象什麼時候建立出來的呢?
	 * 
	 * 1、首先spring容器通過預設的構造函數建立對象
	 * 
	 * 2、init-method="init" 調用初始化方法
	 * 
	 * 3、talk() 調用對象的相關方法
	 * 
	 * 4、destroy-method="destory" 調用銷毀方法
	 */
	@Test
	public void testLife(){
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
		Person p = (Person) ac.getBean("p");
		p.talk();
	}
}