做家教网站要多少钱,软件开发报价单,设计平台图片,重庆在线开放平台本文基于Spring5.3.7 参考#xff1a; kykangyuky Spring中bean的生命周期 阿斌Java之路 SpringBean的生命周期#xff0c; 杨开振 JavaEE互联网轻量级框架整合开发 黑马程序员 JavaEE企业级应用开发教程 马士兵 Spring源码讲解 一. SpringBean生命周期流程图 二. 示例代码 …本文基于Spring5.3.7 参考 kykangyuky Spring中bean的生命周期 阿斌Java之路 SpringBean的生命周期 杨开振 JavaEE互联网轻量级框架整合开发 黑马程序员 JavaEE企业级应用开发教程 马士兵 Spring源码讲解 一. SpringBean生命周期流程图 二. 示例代码
1. 定义果汁描述实体类
package com.xiaobai.spring_bean_life_cycle;import lombok.Data;
import lombok.extern.slf4j.Slf4j;/*** author wangtw* date 2023/6/24 16:38* description 果汁描述实体类*/
Slf4j
Data
public class Source {public Source() {log.info(source实例化);}/*** 水果*/private String fruit;/*** 糖量*/private String sugar;/*** 大小*/private String size;
}2. 定义果汁生成器
package com.xiaobai.spring_bean_life_cycle;import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;/*** author wangtw* date 2023/6/24 16:28* description 果汁生成器*/
Slf4j
Data
public class JuiceMaker implements BeanNameAware, BeanFactoryAware,ApplicationContextAware, InitializingBean, DisposableBean {public JuiceMaker(){log.info(juice实例化);}private String beverageShop;private Source source;/*** 自定义初始化方法*/public void init() {log.info(【{}】执行自定义初始化方法, this.getClass().getSimpleName());}/*** 自定义销毁方法*/public void myDestroy() {log.info(【{}】执行自定义销毁方法, this.getClass().getSimpleName());}public String makeJuice() {String juice 这是一杯由 beverageShop 饮品店提供的 source.getSize() source.getSugar() source.getFruit();return juice;}Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {log.info(【{}】调用BeanFactoryAware接口的setBeanFactory方法, this.getClass().getSimpleName());}Overridepublic void setBeanName(String s) {log.info(【{}】调用BeanNameAware接口的setBeanName方法, this.getClass().getSimpleName());}Overridepublic void destroy() throws Exception {log.info(调用接口DisposableBean的destroy方法);}Overridepublic void afterPropertiesSet() throws Exception {log.info(【{}】调用InitializingBean接口的afterPropertiesSet方法, this.getClass().getSimpleName());}Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {log.info(【{}】调用ApplicationContextAware接口的setApplicationContext方法, this.getClass().getSimpleName());}
}3. 定义Bean实现BeanPostProcessor接口
package com.xiaobai.spring_bean_life_cycle;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;/*** author wangtw* date 2023/6/24 16:07* description*/
Slf4j
public class BeanPostProcessorImpl implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {log.info(【{}】对象{}预初始化开始, bean.getClass().getSimpleName(), beanName);return bean;}Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {log.info(【{}】对象{}预初始化完成, bean.getClass().getSimpleName(), beanName);return bean;}
}4. 定义SpringBean配置类
package com.xiaobai.spring_bean_life_cycle;import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** author wangtw* date 2023/6/25 10:33* description Spring配置类*/
Configuration
public class LifeConfiguration {Bean(beanPostProcessor)public BeanPostProcessor beanPostProcessor() {return new BeanPostProcessorImpl();}Bean(source)public Source source() {Source source new Source();source.setFruit(橙汁);source.setSugar(少糖);source.setSize(大杯);return source;}Bean(value juiceMaker, initMethod init, destroyMethod myDestroy)public JuiceMaker juiceMaker() {JuiceMaker juiceMaker new JuiceMaker();juiceMaker.setSource(source());juiceMaker.setBeverageShop(贡茶);return juiceMaker;}
}5. 测试类及输出结果
package com.xiaobai.spring_bean_life_cycle;import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** author wangtw* date 2023/6/25 10:40* description springBean生命周期测试类*/
Slf4j
public class SpringBeanLifeTest {Testpublic void testLifeCycle() {ConfigurableApplicationContext context new AnnotationConfigApplicationContext(LifeConfiguration.class);JuiceMaker juiceMaker (JuiceMaker) context.getBean(juiceMaker);log.info(juiceMaker.makeJuice());context.close();}
}三. 源码解析
一Bean实例化
1. 根据注解加载Bean
org.springframework.beans.factory.config.BeanFactoryPostProcessor org.springframework.context.annotation.ConfigurationClassPostProcessor#processConfigBeanDefinitions org.springframework.context.annotation.ConfigurationClassParser#parse(java.util.Setorg.springframework.beans.factory.config.BeanDefinitionHolder) org.springframework.context.annotation.ConfigurationClassParser#parse(org.springframework.core.type.AnnotationMetadata, java.lang.String) org.springframework.context.annotation.ConfigurationClassParser#processConfigurationClass org.springframework.context.annotation.ConfigurationClassParser#doProcessConfigurationClass
2. 在SpringBean实例化前会把扫描到的类加载到BeanDefinition中然后将BeanDefinition中的信息注册到Spring容器中
org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext() org.springframework.context.annotation.AnnotationConfigApplicationContext#register org.springframework.context.annotation.AnnotatedBeanDefinitionReader#doRegisterBean org.springframework.beans.factory.support.BeanDefinitionRegistry#registerBeanDefinition
3. 完成了BeanDefinition注册后对Bean进行实例化
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
二初始化
1. 属性赋值
1自定义对象属性赋值
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
2容器对象赋值检查aware接口并设置相关依赖aware接口用于标记判断调用什么方法
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods
2. 执行前置处理方法
org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization
3. 执行初始化方法
1检测Bean是否实现了InitializingBean接口
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods
2调用afterPropertiesSet方法
org.springframework.beans.factory.InitializingBean#afterPropertiesSet
3调用自定义初始化方法
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeCustomInitMethod
4. 执行后置处理方法
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary
创建代理对象 org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#createProxy org.springframework.aop.framework.AopProxy#getProxy(java.lang.ClassLoader)
三使用
四销毁