1. 程式人生 > 其它 >Spring註解驅動開發-生命週期01-指定初始化和銷燬方法[@Bean指定init-method和destroy-method]

Spring註解驅動開發-生命週期01-指定初始化和銷燬方法[@Bean指定init-method和destroy-method]

技術標籤:Spring原始碼(尚矽谷Spring註解版)

/**
* bean的生命週期:
* bean建立---初始化----銷燬的過程
* 容器管理bean的生命週期;
* 我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法
*
* 構造(物件建立)
* 單例項:在容器啟動的時候建立物件
* 多例項:在每次獲取的時候建立物件\
*
* BeanPostProcessor.postProcessBeforeInitialization
* 初始化:
* 物件建立完成,並賦值好,呼叫初始化方法。。。
* BeanPostProcessor.postProcessAfterInitialization

* 銷燬:
* 單例項:容器關閉的時候
* 多例項:容器不會管理這個bean;容器不會呼叫銷燬方法;
*
*
* 遍歷得到容器中所有的BeanPostProcessor;挨個執行beforeInitialization,
* 一但返回null,跳出for迴圈,不會執行後面的BeanPostProcessor.postProcessorsBeforeInitialization
*
* BeanPostProcessor原理
* populateBean(beanName, mbd, instanceWrapper);給bean進行屬性賦值
* initializeBean
* {
* applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
* invokeInitMethods(beanName, wrappedBean, mbd);執行自定義初始化
* applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
*}
*
* 1)、指定初始化和銷燬方法;
* 通過@Bean指定init-method和destroy-method;
* 2)、通過讓Bean實現InitializingBean(定義初始化邏輯),
* DisposableBean(定義銷燬邏輯);
* 3)、可以使用JSR250;
* @PostConstruct:在bean建立完成並且屬性賦值完成;來執行初始化方法
* @PreDestroy:在容器銷燬bean之前通知我們進行清理工作
* 4)、BeanPostProcessor【interface】:bean的後置處理器;
* 在bean初始化前後進行一些處理工作;
* postProcessBeforeInitialization:在初始化之前工作
* postProcessAfterInitialization:在初始化之後工作
*
* Spring底層對 BeanPostProcessor 的使用;
* ①、bean賦值②、注入其他元件③、@Autowired④、生命週期註解功能⑤、@Async,@xxx 都是通過BeanPostProcessor來完成的;
*/

bean的生命週期:
物件建立---初始化----銷燬的過程
容器管理bean的生命週期:
我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法
例項化:
單例項:在容器啟動的時候建立物件
多例項:在每次獲取的時候建立物件
初始化:
物件建立完成,並賦值好,呼叫初始化方法
銷燬:
單例項:容器關閉的時候
多例項:容器不會管理這個bean;容器不會呼叫銷燬方法

指定初始化和銷燬方法:通過@Bean指定init-method和destroy-method

目錄

1、配置類

2、註冊的Bean

3、測試類


1、配置類

package com.atguigu.config;

import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import com.atguigu.bean.Car;

/**
 * bean的生命週期:
 * 		bean建立---初始化----銷燬的過程
 * 容器管理bean的生命週期;
 *      我們可以自定義初始化和銷燬方法;容器在bean進行到當前生命週期的時候來呼叫我們自定義的初始化和銷燬方法
 * 例項化
 * 		單例項:在容器啟動的時候建立物件
 * 		多例項:在每次獲取的時候建立物件
 * 初始化:
 * 		物件建立完成,並賦值好,呼叫初始化方法
 * 銷燬:
 * 		單例項:容器關閉的時候
 * 		多例項:容器不會管理這個bean;容器不會呼叫銷燬方法;
 * 
 */
@ComponentScan("com.atguigu.bean")
@Configuration
public class MainConfigOfLifeCycle {
	
	//@Scope("prototype")
	@Bean(initMethod="init",destroyMethod="detory")
	public Car car(){
		return new Car();
	}
}

2、註冊的Bean

package com.atguigu.bean;

import org.springframework.stereotype.Component;

@Component
public class Car {
	
	public Car(){
		System.out.println("car...constructor...");
	}
	
	public void init(){
		System.out.println("car...init...");
	}
	
	public void destory(){
		System.out.println("car...destory...");
	}

}

3、測試類

package com.atguigu.test;

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.atguigu.config.MainConfigOfLifeCycle;

public class IOCTest_LifeCycle {
	
	@Test
	public void test01(){
		//1、建立ioc容器
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
		System.out.println("容器建立完成...");
		
		//applicationContext.getBean("car");
		//關閉容器
		applicationContext.close();
	}
}