广告
返回顶部
首页 > 资讯 > 精选 >Spring bean生命周期验证的示例分析
  • 384
分享到

Spring bean生命周期验证的示例分析

springbean 2023-05-30 23:05:48 384人浏览 安东尼
摘要

这篇文章主要为大家展示了“spring bean生命周期验证的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring bean生命周期验证的示例分析”这篇文章吧。一、从源码注释看be

这篇文章主要为大家展示了“spring bean生命周期验证的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring bean生命周期验证的示例分析”这篇文章吧。

一、从源码注释看bean生命周期

jdk源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为:

BeanNameAware setBeanName 设置bean名称
2.BeanClassLoaderAware setBeanClassLoader 设置bean类加载器
3.BeanFactoryAware setBeanFactory 设置bean工厂
4.EnvironmentAware setEnvironment 设置环境:profiles+properties
5.EmbeddedValueResolverAware setEmbeddedValueResolver 设置嵌入式值解析器
6.ResourceLoaderAware setResourceLoader 设置资源载入器,只适用于在应用程序上下文中运行
7.ApplicationEventPublisherAware setApplicationEventPublisher注入应用事件发布器ApplicationEventPublisher
8.MessageSourceAware setMessageSource 设置国际化支持
9.ApplicationContextAware setApplicationContext 设置应用上下文
10.ServletContextAware setServletContext 设置servlet上下文
11.BeanPostProcessors postProcessBeforeInitialization 执行bean处理器前置方法
12.InitializingBean afterPropertiesSet 执行初始化Bean设置完属性后置方法
13.a custom init-method definition 执行自定义初始化方法
14.BeanPostProcessors postProcessAfterInitialization 执行bean处理器后置方法

销毁顺序:

DestructionAwareBeanPostProcessors postProcessBeforeDestruction 销毁处理器的前置方法
2.DisposableBean destroy Bean销毁回调方法
3.a custom destroy-method definition 用户自定义销毁方法

核心方法流程图:

Spring bean生命周期验证的示例分析

二、测试验证

2.1分析原理

前面说的17个步骤都可以测试,我们选取其中的8个步骤进行测试如下:

初始化流程:

BeanNameAware setBeanName 设置bean名称
3.BeanFactoryAware setBeanFactory 设置bean工厂
11.BeanPostProcessors postProcessBeforeInitialization 执行bean处理器前置方法
12.InitializingBean afterPropertiesSet 执行初始化Bean设置完属性后置方法
13.a custom init-method definition 执行自定义初始化方法
14.BeanPostProcessors postProcessAfterInitialization 执行bean处理器后置方法

销毁流程:

DisposableBean destroy Bean销毁回调方法
3.a custom destroy-method definition 用户自定义销毁方法

 2.2 代码清单

 1.构建一个Person类,实现BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean接口。

package spring.ioc;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;public class Person implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {    private String name;    private String mobile;     public Person() {    super();    System.out.println("[构造器] 调用Person的构造器实例化");  }  public String getName() {    return name;  }  public void setName(String name) {    System.out.println("[属性注入] name="+name);    this.name = name;  }  public String getMobile() {    return mobile;  }  public void setMobile(String mobile) {    System.out.println("[属性注入] mobile="+mobile);    this.mobile = mobile;  }  @Override  public void destroy() throws Exception {    System.out.println("[接口DisposableBean.destroy() ]");  }  @Override  public void afterPropertiesSet() throws Exception {    System.out.println("[接口InitializingBean.afterPropertiesSet() ]");  }  @Override  public void setBeanName(String name) {    System.out.println("[接口BeanNameAware.setBeanName() ]");  }  @Override  public void setBeanFactory(BeanFactory beanFactory) throws BeansException {    System.out.println("[接口BeanFactoryAware.setBeanFactory() ]");  }  public void myInit(){    System.out.println("[init-method]调用<bean>的init-method属性指定的初始化方法");  }    public void myDestory() {    System.out.println("[destroy-method]调用<bean>的destroy-method属性指定的销毁方法");  }}

自定义工厂后处理器,复写postProcessBeanFactory方法,获取bean定义后添加属性mobile=110

package spring.ioc;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("[MyBeanFactoryPostProcessor工厂后处理器]BeanFactoryPostProcessor实现类构造器!!");  }  @Override  public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)      throws BeansException {    System.out.println("[MyBeanFactoryPostProcessor工厂后处理器]BeanFactoryPostProcessor.postProcessBeanFactory()获取bean定义后添加属性mobile=110");    BeanDefinition bd = arg0.getBeanDefinition("person");    bd.getPropertyValues().addPropertyValue("mobile", "110");  }}

自定义Bean后处理器,复写postProcessBeforeInitialization和postProcessAfterInitialization2个方法,分别对应初始化前后时的操作。

package spring.ioc;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor {  public MyBeanPostProcessor() {    super();    System.out.println("这是BeanPostProcessor实现类构造器!!");  }    @Override  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {    System.out.println("BeanPostProcessor接口方法postProcessBeforeInitialization对属性进行更改!beanName="+beanName);    return bean;  }      @Override  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {    System.out.println("BeanPostProcessor接口方法postProcessAfterInitialization对属性进行更改!beanName="+beanName);    return bean;//注意,如果返回null,后续BeanPostProcessor不会再执行  }  }

自定义实例化bean后处理器适配器,复写postProcessBeforeInstantiation、postProcessBeforeInstantiation、postProcessPropertyValues分别对应实例化Bean前调用、实例化Bean后调用、设置某个属性时调用

注意:InstantiationAwareBeanPostProcessorAdapter ,这里是实例化Instantiation,不是初始化Initialization!!!

package spring.ioc;import java.beans.PropertyDescriptor;import org.springframework.beans.BeansException;import org.springframework.beans.PropertyValues;import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;public class MyInstantiationAwareBeanPostProcessor extends    InstantiationAwareBeanPostProcessorAdapter {  public MyInstantiationAwareBeanPostProcessor() {    super();    System.out.println("这是InstantiationAwareBeanPostProcessorAdapter实现类构造器!!");  }  // 接口方法、实例化Bean之前调用  @Override  public Object postProcessBeforeInstantiation(Class<?> beanClass,String beanName) throws BeansException {    System.out.println("InstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法[实例化Bean之前调用 ]beanname="+beanName);    return null;  }  // 接口方法、实例化Bean之后调用  @Override  public Object postProcessAfterInitialization(Object bean, String beanName)      throws BeansException {    System.out .println("InstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法[实例化Bean之后调用]beanname="+beanName);    return bean;  }  // 接口方法、设置某个属性时调用  @Override  public PropertyValues postProcessPropertyValues(PropertyValues pvs,      PropertyDescriptor[] pds, Object bean, String beanName)      throws BeansException {    System.out.println("InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法 pvs="+pvs+",beanName="+beanName);    return pvs;  }}

测试类,使用ClassPathXmlApplicationContext从xml中读取bean配置文件生成applicationContext容器应用上下文,这一步对应容器初始化。第二部从应用上下文中获取bean。最后一步注册一个关闭钩子,在容器关闭时触发。

package spring.ioc;import org.junit.Test; 6 import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;10 import spring.aop.xml.dao.Dao;public class IOCTest {    @Test  public void iocPersonTest(){    System.out.println("=============容器初始化======start=========");    @SuppressWarnings("resource")    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("simple_spring_bean.xml");//源码入口    System.out.println("=============容器初始化=======end========");    System.out.println("=============获取person bean====start=======");    Person person = applicationContext.getBean("person",Person.class);//获取Bean    System.out.println("=============获取person bean====end=======,person类名="+person.getClass().getName());    System.out.println("=============注册关闭钩子,关闭容器(JVM shutdown)时触发钩子!================");    ((ClassPathXmlApplicationContext)applicationContext).reGISterShutdownHook();  }}

直接运行,结果如下:

=============容器初始化======start=========log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).log4j:WARN Please initialize the log4j system properly.[MyBeanFactoryPostProcessor工厂后处理器]BeanFactoryPostProcessor实现类构造器!![MyBeanFactoryPostProcessor工厂后处理器]BeanFactoryPostProcessor.postProcessBeanFactory()获取bean定义后添加属性mobile=110这是BeanPostProcessor实现类构造器!!这是InstantiationAwareBeanPostProcessorAdapter实现类构造器!!InstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法[实例化Bean之前调用 ]beanname=person[构造器] 调用Person的构造器实例化InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法 pvs=PropertyValues: length=2; bean property 'mobile'; bean property 'name',beanName=person[属性注入] mobile=110[属性注入] name=张三[接口BeanNameAware.setBeanName() ][接口BeanFactoryAware.setBeanFactory() ]BeanPostProcessor接口方法postProcessBeforeInitialization对属性进行更改!beanName=person[接口InitializingBean.afterPropertiesSet() ][init-method]调用<bean>的init-method属性指定的初始化方法BeanPostProcessor接口方法postProcessAfterInitialization对属性进行更改!beanName=personInstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法[实例化Bean之后调用]beanname=person=============容器初始化=======end=====================获取person bean====start====================获取person bean====end=======,person类名=spring.ioc.Person=============注册关闭钩子,关闭容器(JVM shutdown)时触发钩子!================[接口DisposableBean.destroy() ][destroy-method]调用<bean>的destroy-method属性指定的销毁方法

总结流程:

Spring bean生命周期验证的示例分析

Spring bean生命周期验证的示例分析

以上是“Spring bean生命周期验证的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Spring bean生命周期验证的示例分析

本文链接: https://www.lsjlt.com/news/222137.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring bean生命周期验证的示例分析
    这篇文章主要为大家展示了“Spring bean生命周期验证的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring bean生命周期验证的示例分析”这篇文章吧。一、从源码注释看be...
    99+
    2023-05-30
    spring bean
  • Java Spring Bean生命周期管理的示例分析
    小编给大家分享一下Java Spring Bean生命周期管理的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Spring Bean的生命周期管理一、Spring Bean的生命周期通过以下方式...
    99+
    2023-06-22
  • Spring配置使用之Bean生命周期的示例分析
    这篇文章主要介绍了Spring配置使用之Bean生命周期的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基本概念Spring 中的 Bean 的生命周期,指的是 Be...
    99+
    2023-05-31
    spring bean
  • Spring Bean生命周期源码分析
    这篇“Spring Bean生命周期源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring ...
    99+
    2023-07-05
  • 【Spring】Spring的Bean的生命周期
    作者简介:大家好,我是五度鱼,一个普通的Java领域博主,不停输出Java技术博客和干货。座右铭:锲而不舍,金石可镂。个人主页:五度鱼学Java的主页 文章目录 前言1. 什么是Bean的生命周期?2. 为什么要知道Bean...
    99+
    2023-08-17
    java Bean生命周期 spring
  • Spring Bean中的作用域和生命周期实例分析
    这篇文章主要介绍“Spring Bean中的作用域和生命周期实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Bean中的作用域和生命周期实例分析”文章能帮助大...
    99+
    2023-07-02
  • Java之Bean的生命周期实例分析
    本篇内容主要讲解“Java之Bean的生命周期实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java之Bean的生命周期实例分析”吧!一、什么是生命周期首先理解下什么是生命周期从创建到消...
    99+
    2023-07-02
  • Spring创建Bean的生命周期详析
    目录1.Bean 的创建生命周期2.Spring AOP 大致流程3.Spring 事务4.Spring 源码阅读前戏BeanDefinitionBeanDefinitionRead...
    99+
    2022-11-13
  • 全面详解Spring Bean生命周期教程示例
    目录Spring 中 Bean 的生命周期Bean 的实例化构造方法注入工厂方法注入Bean 的属性赋值setter注入构造方法注入Bean 的初始化初始化方法Initializin...
    99+
    2023-05-14
    Spring Bean生命周期 Spring Bean
  • Vue2.0生命周期的示例分析
    这篇文章主要为大家展示了“Vue2.0生命周期的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue2.0生命周期的示例分析”这篇文章吧。网上已经有很多...
    99+
    2022-10-19
  • vue生命周期的示例分析
    这篇文章主要介绍了vue生命周期的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue生命周期图解感谢你能够认真阅读完这篇文章,希望小编分享的“vue生命周期的示例分...
    99+
    2023-06-14
  • Spring源码解析之Bean的生命周期
    一、Bean的实例化概述 前一篇分析了BeanDefinition的封装过程,最终将beanName与BeanDefinition以一对一映射关系放到beanDefinitionMa...
    99+
    2022-11-12
  • Spring Bean的生命周期 -- Spring入门(三)
    文章目录 前言1. 理解bean的生命周期2. Bean 生命周期的执行过程3. Bean生命周期控制入门案例4. 关闭IOC容器的两种方式5. 通过继承接口绑定生命周期方法 总结 前言 为了巩固所学的知识,作者尝试着开始...
    99+
    2023-08-17
    spring java 后端
  • React中生命周期的示例分析
    这篇文章将为大家详细讲解有关React中生命周期的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。React的生命周期两张图带你理解 React的生命周期React的生命周期(旧)class&nbs...
    99+
    2023-06-20
  • Vue中生命周期的示例分析
    这篇文章将为大家详细讲解有关Vue中生命周期的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最简单的Vue 实例//html <div id=&q...
    99+
    2022-10-19
  • Spring 中 Bean 的生命周期详解
    目录前言1.Bean 生命周期2.代码演示总结前言 Java 中的公共类称之为 Bean 或 Java Bean,而 Spring 中的 Bean 指的是将对象的生命周期,交个 Sp...
    99+
    2022-11-13
  • spring之Bean的生命周期详解
    Bean的生命周期:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁Bean的定义Bean 是 spring 装配的组件模型,一切实体类都可以配置成一个 Bean ,进而就可以在任何其他的 Bean 中使用,一个 Be...
    99+
    2023-05-31
    spring bean 生命周期
  • Spring Bean的生命周期是什么
    这篇“Spring Bean的生命周期是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring ...
    99+
    2023-07-05
  • Spring bean的生命周期是什么
    Spring bean的生命周期包括以下阶段:1. 实例化(Instantiation):在容器启动时,Spring根据配置信息或注...
    99+
    2023-08-24
    Spring bean
  • Spring Bean生命周期,好像人的一生。。
    大家好,我是老三,上节我们手撸了一个简单的IOC容器五分钟,手撸一个Spring容器!,这节我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像。 简单说说IoC和Bean IoC...
    99+
    2023-09-27
    spring java 后端
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作