Spring之SpringBean的生命周期详解

Posted 小明学习心得

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring之SpringBean的生命周期详解相关的知识,希望对你有一定的参考价值。

前言:bean的生命周期:指  bean创建——初始化——销毁  的过程

下面先给出我的参考答案,具体分析请看下文详解:

Spring Bean生命周期为:
1、实例化BeanFactoryPostProcessor实现类
2、执行BeanFactoryPostProcessor的postProcessBeanFactory方法
3、实例化BeanPostProcessor实现类
4、实例化InstantiationAwareBeanPostProcessor实现类
5、执行InstantiationAwareBeanPostProcessor的postProcessorBeforeInstantiation方法
6、执行Bean的构造方法
7、执行InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法

8、为Bean注入属性

9、调用BeanNameAware的setBeanName方法
10、调用BeanFactoryAware的setBeanFactory方法
11、执行BeanFactoryProcessor的postProcessorBeforeInitlalization方法
12、执行InitializingBean的afterPropertiesSet方法
13、调用<bean>的init-method属性指定的初始化方法
14、执行BeanPostProcessor的postProcessAfterinitialization方法
15、执行InstantiationAwareBeanPostProcessor的postProcessAfterinitialization方法

16、容器初始化成功,执行业务代码后,下面开始销毁容器

17、调用DisposibleBean的Destory方法
18、调用<bean>的destroy-method属性指定的初始化方法

通过一段代码的运行结果阐述Spring Bean的Cyclelife的过程,最后结合源代码对SpringBean生命周期进行文字性总结。

本文代码github链接:​GitHub - FumingcAI666/spring-demo: 实现Spring Bean生命周期,实现Spring AOP,实现Spring IOC,实现SpringMVC​

首先配合此段代码先有个宏观性(创建、初始化、销毁)认识:

测试代码:

package cn.spring.cyclelife;

import cn.spring.bean.FmcBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* @author macFmc
* @date 2019/10/9-17:50
*/
public class TestCyclelife
public static void main(String[] args)
System.out.println("--------------【初始化容器】---------------");

ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/beandemo.xml");
System.out.println("-------------------【容器初始化成功】------------------");
//得到studentBean,并显示其信息
FmcBean fmcBean = context.getBean("fmcBean", FmcBean.class);
System.out.println(fmcBean);

System.out.println("--------------------【销毁容器】----------------------");
((ClassPathXmlApplicationContext) context).registerShutdownHook();

测试Bean例类:中的 ​​myInit()​​ 和 ·myDestroy()· 方法供我们在配置文件中通过init-method和destroy-method属性进行指定。

package cn.spring.bean;

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;

/**
* 测试生命周期的Bean
*
* @author macFmc
* @date 2019/10/9-17:45
*/
public class FmcBean implements InitializingBean, DisposableBean, BeanNameAware, BeanFactoryAware
private String name;
private int age;
/**
* 实现了BeanNameAware接口,Spring可以将BeanName注入该属性中
*/
private String beanName;
/**
* 实现了BeanFactory接口,Spring可将BeanFactory注入该属性中
*/
private BeanFactory beanFactory;

public FmcBean()
System.out.println("【Bean构造方法】学生类的无参构造方法");


@Override
public String toString()
final StringBuilder sb = new StringBuilder("FmcBean");
sb.append("name=").append(name).append(\\);
sb.append(", age=").append(age);
sb.append(", beanName=").append(beanName).append(\\);
sb.append(", beanFactory=").append(beanFactory);
sb.append();
return sb.toString();


public String getName()
return name;


public void setName(String name)
System.out.println("【set注入】注入学生的name属性");
this.name = name;


public int getAge()
return age;


public void setAge(int age)
System.out.println("【set注入】注入学生的age属性");
this.age = age;


/**
* 自己编写的初始化方法
*/
public void myInit()
System.out.println("【init-method】调用init-method属性配置的初始化方法");


/**
* 自己编写的销毁方法
*/
public void myDestroy()
System.out.println("【destroy-method】调用destroy-method属性配置的销毁方法");


/**
* BeanFactoryAware接口的方法
*
* @param beanFactory
* @throws BeansException
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException
this.beanFactory = beanFactory;
System.out.println("【BeanFactoryAware接口】调用BeanFactoryAware的setBeanFactory方法得到beanFactory引用");


/**
* BeanNameAware接口的方法
*
* @param name
*/
@Override
public void setBeanName(String name)
this.beanName = name;
System.out.println("【BeanNameAware接口】调用BeanNameAware的setBeanName方法得到Bean的名称");


/**
* InitializingBean接口的方法
*
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception
System.out.println("【InitializingBean接口】调用InitializingBean接口的afterPropertiesSet方法");


/**
* DisposableBean接口的方法
*
* @throws Exception
*/
@Override
public void destroy() throws Exception
System.out.println("【DisposableBean接口】调用DisposableBean接口的destroy方法");

实现BeanPostProcessor接口:

package cn.spring.cyclelife;

import org.Spring之bean的生命周期

大厂高频面试题Spring Bean生命周期最详解

Spring生命周期详解 + 应用实例

Spring生命周期详解 + 应用实例

springbean的生命周期是啥?

引点科技私房菜专栏之Spring-Bean生命周期和作用域以及实现方式