IOC容器生命周期測驗
參考:https://www.cnblogs.com/zrtqsk/p/3735273.html
流程圖
這里的流程圖可以和最后的輸出結果對比,逐一對比來了解Spring Bean的生命周期,輸出結果已經經過很認真的整理,以及去除不必要的日志 ,并且對輸出結果做了優化,容易理解,


流程總結
Bean的完整生命周期經歷了各種方法呼叫,這些方法可以劃分為以下幾類:
-
Bean自身的方法: 這個包括了Bean本身呼叫的方法和通過組態檔中的init-method和destroy-method指定的方法
-
Bean級生命周期介面方法:這個包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean這些介面的方法
-
容器級生命周期介面方法:這個包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 這兩個介面實作,一般稱它們的實作類為“后處理器”,
-
工廠后處理器介面方法:這個包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工廠后處理器介面的方法,工廠后處理器也是容器級的,在應用背景關系裝配組態檔之后立即呼叫,
測驗Spring Bean生命周期
Demo 類
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
public class Demo implements BeanFactoryAware, ApplicationContextAware,
BeanNameAware, InitializingBean, DisposableBean {
private BeanFactory beanFactory;
private String beanName;
private ApplicationContext ioc;
private int name;
public Demo() {
System.out.println("呼叫Demo構造方法...");
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("[BeanFactoryAware]... setBeanFactory : " + beanName);
this.beanFactory = beanFactory;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("[ApplicationContextAware]... setIOC : " + applicationContext);
this.ioc = applicationContext;
}
@Override
public void setBeanName(String s) {
System.out.println("[BeanNameAware]... setBeanName : " + s);
this.beanName = s;
}
@Override
public void destroy() throws Exception {
System.out.println("[DisposableBean]... ");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("[InitializingBean]... afterPropertiesSet()");
}
public void myInit() {
System.out.println("[init-method]...");
}
public void myDestroy() {
System.out.println("[destroy-method]...");
}
@Override
public String toString() {
return "Demo{" +
"beanFactory=" + beanFactory +
", beanName='" + beanName + '\'' +
", ioc=" + ioc +
", name=" + name +
'}';
}
public BeanFactory getBeanFactory() {
return beanFactory;
}
public String getBeanName() {
return beanName;
}
public ApplicationContext getIoc() {
return ioc;
}
public void setIoc(ApplicationContext ioc) {
this.ioc = ioc;
}
public int getName() {
return name;
}
public void setName(int name) {
System.out.println("注入name屬性...");
this.name = name;
}
}
MyBeanFactoryPostProcessor:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public MyBeanFactoryPostProcessor() {
super();
System.out.println("BeanFactoryPostProcessor的實作類構造器");
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("BeanFactoryPostProcessor呼叫postProcessorBeanFactory方法");
BeanDefinition bd = configurableListableBeanFactory.getBeanDefinition("demo");
bd.getPropertyValues().addPropertyValue("name", "100");
}
}
MyBeanPostProcessor:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
public MyBeanPostProcessor() {
System.out.println("MyBeanPostProcessor的建構式");
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("[postProcessor]... postProcessAfterInitialization");
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("[postProcessor]... postProcessBeforeInitialization");
return bean;
}
}
MyInstantiationAwareBeanPostProcessor:
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
import java.beans.PropertyDescriptor;
public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {
public MyInstantiationAwareBeanPostProcessor() {
super();
System.out.println("MyInstantiationAwareBeanPostProcessor... 的建構式");
}
/**
* 實體化bean前呼叫
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("InstantiationAwareBeanPostProcessor呼叫postProcessBeforeInstantiation方法");
return super.postProcessBeforeInitialization(bean, beanName);
}
/**
* 實體化bean之后呼叫
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("InstantiationAwareBeanPostProcessor呼叫postProcessAfterInstantiation方法");
return super.postProcessAfterInitialization(bean, beanName);
}
/**
* 設定某個屬性時呼叫
* @param pvs
* @param pds
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
System.out.println("InstantiationAwareBeanPostProcessor呼叫postProcessPropertyValues方法");
return super.postProcessPropertyValues(pvs, pds, bean, beanName);
}
}
application.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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.xxx.springboot.springBeanTest"/>
<bean id="beanPostProcessor" class="com.xxx.springboot.springBeanTest.MyBeanPostProcessor"/>
<bean id="instantiationAwareBeanPostProcessor" class="com.xxx.springboot.springBeanTest.MyInstantiationAwareBeanPostProcessor"/>
<bean id="beanFactoryPostProcessor" class="com.xxx.springboot.springBeanTest.MyBeanFactoryPostProcessor"/>
<bean id="demo" class="com.xxx.springboot.springBeanTest.Demo"
scope="singleton" p:name="200"
init-method="myInit" destroy-method="myDestroy" />
</beans>
Main函式:
public static void main(String[] args) {
System.out.println("IOC starting...");
ClassPathXmlApplicationContext ioc =
new ClassPathXmlApplicationContext("app.xml");
System.out.println("IOC started...");
Demo demo = ioc.getBean("demo", Demo.class);
System.out.println(demo);
System.out.println("IOC closing...");
ioc.close();
System.out.println("IOC closed...");
}
輸出結果:
******************** IOC starting... ********************
18:51:50.401 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2ac1fdc4
18:51:50.649 [main] DEBUG org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loaded 9 bean definitions from class path resource [app.xml]
18:51:50.676 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
18:51:50.699 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'
18:51:50.701 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'beanFactoryPostProcessor'
BeanFactoryPostProcessor的實作類構造器
18:51:50.702 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
BeanFactoryPostProcessor呼叫postProcessorBeanFactory方法
18:51:50.704 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'
18:51:50.706 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'
18:51:50.712 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'beanPostProcessor'
MyBeanPostProcessor的建構式
18:51:50.729 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'instantiationAwareBeanPostProcessor'
MyInstantiationAwareBeanPostProcessor... 的建構式
18:51:50.738 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'demo'
呼叫Demo構造方法...
InstantiationAwareBeanPostProcessor呼叫postProcessPropertyValues方法
注入name屬性...
[BeanNameAware]... setBeanName : demo
[BeanFactoryAware]... setBeanFactory : demo
[ApplicationContextAware]... setIOC : org.springframework.context.support.ClassPathXmlApplicationContext@2ac1fdc4, started on Wed Dec 30 18:51:50 CST 2020
[postProcessor]... postProcessBeforeInitialization
InstantiationAwareBeanPostProcessor呼叫postProcessBeforeInstantiation方法
[InitializingBean]... afterPropertiesSet()
[init-method]...
[postProcessor]... postProcessAfterInitialization
InstantiationAwareBeanPostProcessor呼叫postProcessAfterInstantiation方法
******************** IOC started... ********************
Demo{beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@704d6e83: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.event.internalEventListenerProcessor,org.springframework.context.event.internalEventListenerFactory,beanPostProcessor,instantiationAwareBeanPostProcessor,beanFactoryPostProcessor,demo]; root of factory hierarchy, beanName='demo', ioc=org.springframework.context.support.ClassPathXmlApplicationContext@2ac1fdc4, started on Wed Dec 30 18:51:50 CST 2020, name=100}
******************** IOC closing... ********************
18:51:50.815 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Closing org.springframework.context.support.ClassPathXmlApplicationContext@2ac1fdc4, started on Wed Dec 30 18:51:50 CST 2020
[DisposableBean]...
[destroy-method]...
******************** IOC closed... ********************
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/243305.html
標籤:java
上一篇:SpringIOC
