1. 程式人生 > >【spring系列】- IOC容器Bean生命週期

【spring系列】- IOC容器Bean生命週期

Spring IOCBean的生命週期:

bean物件例項化—>屬性注入—>beanfactory—>ApplicationContext---->postProcessBeforeInitialization—>

  • InitializingBean介面(或自定義)---->postProcessAfterInitialization------>DisposableBean(銷燬Bean)

Bean生命週期相關介面介紹:

Bean的生命週期
BeanNameAware:Bean可以獲取在BeanFactory中的名稱
BeanFactoryAware:Bean可以獲取所在的BeanFactory物件
ApplicationContextAware:可以獲取Bean所在的ApplicationContext
InitializingBean:Bean屬性設定完成後的自定義操作介面:例如設定自定義的初始化方法init-method
DisposableBean:銷燬Bean的相關資源

Spring配置檔案:(採用預設的單例Bean測試)
配置簡單的Bean和一個Bean後置處理器,並且設定自定義的初始化方法:
init-method=“defineInitMethod”

<bean id="concreteBean"  init-method="defineInitMethod"  class="com.zhiwei.lifecycle.ConcreteBean">
<property name="name" value="squirrel"/>
</bean>

<bean  class="com.zhiwei.lifecycle.BeanPostProcessorCase"/>

Bean物件定義,實現相關生命週期介面:

package com.zhiwei.lifecycle;

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.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class ConcreteBean implements BeanNameAware,BeanFactoryAware,
ApplicationContextAware,InitializingBean,DisposableBean{

	private String name;
	
	public ConcreteBean() {
		System.err.println("ConcreteBean例項物件被建立.......");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		System.err.println("ConcreteBean例項物件預設name屬性注入.........");
		this.name = name;
	}

	/**
	 * BeanNameAware:獲取Bean在BeanFactory的名稱:id
	 */
	@Override
	public void setBeanName(String name) {
		System.err.println("BeanNameAware:ConcreteBean例項物件在BeanFactory的名稱:"+name);
	}

	/**
	 * BeanFactoryAware:獲取Bean所在的Beanfactory
	 */
	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		boolean flag = beanFactory.containsBean("concreteBean");  //使用BeanFactory的方法判斷Bean是否存在
		System.err.println("BeanfactoryAware:BeanFactory是否存在concreteBean定義:"+flag);
	}

	/**
	 * ApplicationContextAware:獲取Bean例項所在的高階BeanFactory容器:ApplicationContext
	 */
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		boolean flag = applicationContext.containsBean("concreteBean");
		System.err.println("ApplicationContextAware:ApplicationContext是否存在concreteBean定義:"+flag);
	}

	/**
	 * InitializingBean:Bean屬性設定完成之後的自定義初始化工作
	 */
	@Override
	public void afterPropertiesSet() throws Exception {
		System.err.println("ConcreteBean完成屬性設定,正在進行初始化........");
	}

	/**
	 * DisposableBean:銷燬Bean相關的資源:destroy-method屬性
	 */
	@Override
	public void destroy() throws Exception {
		 System.err.println("IOC容器正在銷燬Bean資源........");
	}
	
	/**
	 * 自定義初始化方法:init-method屬性
	 */
	public void defineInitMethod(){
		System.err.println("Bean正在自定義初始化......");
	}
}

Bean後置處理器定義

package com.zhiwei.lifecycle;

import java.util.Date;

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

/**
 * BeanPostProcessor:後置處理器(針對所有的Bean例項) 作用:Bean完全例項化之前可以修改Bean的屬性
 */
public class BeanPostProcessorCase implements BeanPostProcessor {

	/**
	 * Bean初始化之前被呼叫
	 */
	public Object postProcessBeforeInitialization(Object object, String id) throws BeansException {

		System.err.println("正在進行" + object + "例項初始化:,id =" + id + ",時間:" + new Date());
		return object;
	};

	/**
	 * Bean初始化之後被呼叫
	 */
	@Override
	public Object postProcessAfterInitialization(Object object, String id) throws BeansException {
		System.err.println("已經完成" + object + "例項初始化:,id =" + id + ",時間:" + new Date());
		return object;
	}
}

測試類:

package com.zhiwei.lifecycle;

import org.springframework.context.*;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainTest {

	public static void main(String[] args) {
		
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("com/zhiwei/lifecycle/applicationContext.xml");
		ConcreteBean concreteBean=(ConcreteBean) applicationContext.getBean("concreteBean");
		System.out.println(concreteBean.getName());
		
		ConfigurableApplicationContext cac = (ConfigurableApplicationContext) applicationContext;
		cac.close();  //關閉IOC容器
	}
}

控制檯列印日誌:

ConcreteBean例項物件被建立…
ConcreteBean例項物件預設name屬性注入…
BeanNameAware:ConcreteBean例項物件在BeanFactory的名稱:concreteBean
BeanfactoryAware:BeanFactory是否存在concreteBean定義:true
ApplicationContextAware:ApplicationContext是否存在concreteBean定義:true
正在進行[email protected]例項初始化:,id =concreteBean,時間:Tue Feb 14 14:50:47 CST 2017
ConcreteBean完成屬性設定,正在進行初始化…
Bean正在自定義初始化…
已經完成[email protected]例項初始化:,id =concreteBean,時間:Tue Feb 14 14:50:47 CST 2017
squirrel
IOC容器正在銷燬Bean資源…

結論:

控制檯列印日誌直接顯示了Bean的生命週期活動

相關推薦

spring系列- IOC容器Bean生命週期

Spring IOCBean的生命週期: bean物件例項化—>屬性注入—>beanfactory—>ApplicationContext---->postProcessBeforeInitialization—> Initi

Spring註解2、Bean生命週期

1、初始化和銷燬 通過@Bean註解的initMethod和destroyMethod屬性 InitializingBean介面、DisposableBean介面 可以使用JSR250: @PostConstruct:在Bean建立完成並且屬性

spring系列之7:生命週期-BeanPostProcessor原理以及在spring底層中的運用

本章節重點說一下我們自定義的BeanPostProcessor的執行機制和呼叫棧。 事前準備: 1.自定義beanPostProcessor 2.註冊自定義的beanPostProcessor到容器中 1.自定義beanPostProcessor @Componen

spring-IOC容器bean生命週期

Spring IOC 容器可以管理 Bean 的生命週期, Spring 允許在 Bean 生命週期的特定點執行定製的任務. Spring IOC 容器對 Bean 的生命週期進行管理的過程: 通過

spring系列之6:bean的初始化和銷燬方法

bean的生命週期:bean建立---初始化----銷燬的過程 容器管理bean的生命週期:我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法 構造(物件建立): 單例項:在容器啟動的時候建立物件 多例項:在每次獲

Spring 系列一、如何從spring中獲取bean

導包 spring要管理的類資訊 package com.liuyong666.service.impl; ​ import com.liuyong666.service.PersonService; public class PersonServiceBean implements Person

spring系列之8:屬性賦值

一:使用@Value賦值     基本數值     可以寫SpEL; #{}     可以寫${};取出配置檔案【properties】中的值(在執行環境變數裡面的值) demo:set,get省略 @Value("張三") private String na

spring系列之14:spring宣告式事務實現原理剖析

通過上一節事務環境搭建,我們知道,在搭建的5個步驟中,有兩個是spring為我們提供底層去稍作配置,然後使用的, 這兩個操作涉及的便是: @EnableTransactionManagement PlatformTransactionManager 其中,Platfor

spring系列- Springmvc整合apache shiro安全框架

shiro: shiro是apache開源的安全框架,可以方便用來處理使用者資訊認證、使用者授權控制、資訊加密等功能,因為其小巧而功能強大在很多SSM架構的web應用系統中被廣泛採用,shiro的架構設計個人覺得結構很清晰,對於想向更高層次發展的開發人員來說,

Spring 系列1. 搭建和配置Spring與jdbc整合的環境

配置資料來源 <!-- 配置結點,可以使用佔位符 --> <context:property-placeholder location=“classpath:jdbc.properties”/> <bean id="dataSource" class="org.apach

Spring系列——Spring Framework簡介(二)

目錄 Core Container Core Container由spring-core,spring-beans,spring-context,spring-context-support,and spring-expression這些模組組成。

spring系列- springmvc國際化的工作原理

國際化:頁面響應式佈局一個頁面針對不同的裝置進行相應的顯示,國際化則是也個頁面針對不同的地區/語言進行相應的自適應的顯示 SpringMVC支援的國際化的三個類: ResourceBundleMessageSource: 國際化訊息資源的封裝類,主要配置不同地

spring系列- Spring的FactoryBean的基本認識

FactoryBean:工廠Bean IOC容器內部一種特殊的Bean,主要作用就是管理內部的Bean例項物件(單例/原型物件),扮演類似工廠的角色 特點: 通過Bean名稱只能獲取其生產的物件,

SQL Server機器學習的生命週期和角色

機器學習專案十分複雜,因為它們需要不同組專業人員的技能協作。本文旨在介紹的機器學習的生命週期、參與機器學習的專業人員角色介紹以及SQL Server如何支援主體的需求任務。 機器學習生命週期 機器學習是一個複雜的過程,許多方面花費的時間比預期更復雜。下面是一些機器學習要求企業中的資

Spring Framework 深入—— IoC容器初始化 -> Bean定義資源的Resource定位

基本概念 ApplicationContext 繼承體系 本文主要關注ApplicationContext的繼承體系,至於BeanFactory的分支,以後再研究。 BeanFactory or ApplicationContext? Bea

spring原始碼分析IOC容器初始化(二)

前言:在【spring原始碼分析】IOC容器初始化(一)中已經分析了匯入bean階段,本篇接著分析bean解析階段。 1.解析bean程式呼叫鏈 同樣,先給出解析bean的程式呼叫鏈: 根據程式呼叫鏈,整理出在解析bean過程中主要涉及的類和相關方法。 2.解析bean原始碼分

Spring學習21Bean生命週期回撥:初始化回撥和銷燬回撥

實現Bean初始化回撥和銷燬回撥各有三種方法,一是實現介面方法,二是在XML配置,三是使用註解 初始化回撥 1、使用介面 org.springframework.beans.factory.InitializingBean介面類的作用是:在容器設定

spring ioc容器結構初始化步驟以及bean生命週期和三種建立方式

建立物件的三種方式:             1、採用預設的建構函式建立        2、採用靜態工廠方法           1、寫一個靜態工廠方法類                public class HelloWorldFactory {    

Spring- IOC容器初始化過程

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

SpringIOC容器註解彙總,你想要的都在這兒了!!

## 寫在前面 > 之前,我們在【Spring】專題中更新了不少關於Spring註解相關的文章,有些小夥伴反饋說,看歷史文章的話比較零散,經常會忘記自己看到哪一篇了。當開啟一篇新文章時,總感覺自己似乎是看到過了,又感覺自己沒有看到過。那怎麼辦呢?為了小夥伴們檢視方便,我在這裡將Spring註解的使用方