【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學習21】Bean生命週期回撥:初始化回撥和銷燬回撥
實現Bean初始化回撥和銷燬回撥各有三種方法,一是實現介面方法,二是在XML配置,三是使用註解 初始化回撥 1、使用介面 org.springframework.beans.factory.InitializingBean介面類的作用是:在容器設定
spring ioc容器結構初始化步驟以及bean生命週期和三種建立方式
建立物件的三種方式: 1、採用預設的建構函式建立 2、採用靜態工廠方法 1、寫一個靜態工廠方法類 public class HelloWorldFactory {
【Spring】- IOC容器初始化過程
浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>
【Spring】IOC容器註解彙總,你想要的都在這兒了!!
## 寫在前面 > 之前,我們在【Spring】專題中更新了不少關於Spring註解相關的文章,有些小夥伴反饋說,看歷史文章的話比較零散,經常會忘記自己看到哪一篇了。當開啟一篇新文章時,總感覺自己似乎是看到過了,又感覺自己沒有看到過。那怎麼辦呢?為了小夥伴們檢視方便,我在這裡將Spring註解的使用方