Spring学习笔记之bean生命周期

前言

上一篇文章主要学习了下bean的配置、注入、自定义属性编辑器,今天来熟悉bean的生命周期。

任何一个事物都有自己的生命周期,生命的开始、生命中、生命结束。大家最熟悉的应该是servlet 的生命周期吧。和 servlet 一样 spring bean 也有自己的生命周期。

在开发中生命周期是一个很常见的名词,基本每种编程语言都能找到与它关联的。关于bean的生命周期我在网上也找了好多,基本都差不多。这里我主要是想通过代码来验证,毕竟学的知识都是一样的,都是学的Java,最重要的是动手练习,这样印象更深。

下面是它生命周期的描述,我们通过demo来进行验证。

下图是它执行的顺序。

一、创建LiftCycle类实现BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean,ApplicationContextAware5个接口方法

package Cuiyw.Spring.Service;
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;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class LifeCycle implements BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean,ApplicationContextAware{

 private String name;
 public String getName() {
 System.out.println("getName name="+name);
 return name;
 }
 public void setName(String name) {
  System.out.println("setName name="+name);
 this.name = name;
 }
 public void afterPropertiesSet() throws Exception {
 // TODO Auto-generated method stub
  System.out.println("InitializingBean.afterPropertiesSet()");
 }
 public void setBeanName(String arg0) {
 // TODO Auto-generated method stub
 System.out.println("BeanNameAware.setBeanName");
 }
 public void setBeanFactory(BeanFactory arg0) throws BeansException {
 // TODO Auto-generated method stub
 System.out.println("BeanFactoryAware.setBeanFactory");
 }
 public void destroy() throws Exception {
 // TODO Auto-generated method stub
 System.out.println("DisposableBean.destroy");
 }
 public void myInit() {
 System.out.println("【init-method】调用<bean>的init-method属性指定的初始化方法");
 }
 public void myDestory() {
 System.out.println("【destroy-method】调用<bean>的destroy-method属性指定的初始化方法");
 }
 public void setApplicationContext(ApplicationContext arg0) throws BeansException {
 // TODO Auto-generated method stub
  System.out.println("ApplicationContextAware.setApplicationContext");
 }
}

二、注册InstantiationAwareBeanPostProcessor接口

package Cuiyw.Spring.Service;

import java.beans.PropertyDescriptor;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor;

public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor{
 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
 // TODO Auto-generated method stub
 System.out.println("InstantiationAwareBeanPostProcessor.postProcessAfterInitialization");
 return bean;
 }
 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
 // TODO Auto-generated method stub
 System.out.println("InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization");
 return bean;
 }
 public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
 // TODO Auto-generated method stub
 System.out.println("InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation");
 return true;
 }
 public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
 // TODO Auto-generated method stub
 System.out.println("InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation");
 return null;
 }
 public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean,
  String beanName) throws BeansException {
 // TODO Auto-generated method stub
 System.out.println("InstantiationAwareBeanPostProcessor.postProcessPropertyValues");
 return pvs;
 }
}

三、注册BeanPostProcessor接口

其实InstantiationAwareBeanPostProcessor继承BeanPostProcessor,所以在上面我也实现了BeanPostProcessor接口的方法

package Cuiyw.Spring.Service;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
 // TODO Auto-generated method stub
 System.out.println("BeanPostProcessor.postProcessAfterInitialization ");
 return bean;
 }
 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
 // TODO Auto-generated method stub
 System.out.println("BeanPostProcessor.postProcessBeforeInitialization");
 return bean;
 }
}

四、注册BeanFactoryPostProcessor接口

package Cuiyw.Spring.Service;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
 public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
 // TODO Auto-generated method stub
 System.out.println("BeanFactoryPostProcessor.postProcessBeanFactory");
 }
}

五、在上下文中配置

这里还是在上一个博客demo的基础上进行修改,为了有其他干扰,我先把service去掉了。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="beanPostProcessor" class="Cuiyw.Spring.Service.MyBeanPostProcessor"></bean>
<bean id="instantiationAwareBeanPostProcessor" class="Cuiyw.Spring.Service.MyInstantiationAwareBeanPostProcessor"></bean>
<bean id="beanFactoryPostProcessor" class="Cuiyw.Spring.Service.MyBeanFactoryPostProcessor"></bean>
<bean id="lifeCycle" class="Cuiyw.Spring.Service.LifeCycle" init-method="myInit" destroy-method="myDestory">
<property name="name" value="cuiyw1"></property>
</bean>
</beans>

六、在main中使用bean

package Cuiyw.SpringAop;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import Cuiyw.Spring.IService.IService;
import Cuiyw.Spring.Service.LifeCycle;

public class App
{
 public static void main( String[] args )
 {
 ApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"ApplicationContext.xml"});
 BeanFactory factory=context;
 LifeCycle lifeCycle=factory.getBean("lifeCycle",LifeCycle.class);
 lifeCycle.setName("cuiyw2");
  System.out.println("lifeCycle.name="+lifeCycle.getName());
 ((ClassPathXmlApplicationContext)factory).registerShutdownHook();
 /*service=(IService)factory.getBean("ServiceA");
 service.service("Cuiyw ServiceA");
 service=(IService)factory.getBean("ServiceImpl");
 service.service("Cuiyw ServiceImpl"); */
 }
}

七、输入打印结果

可以发现输出的顺序和上面图的顺序基本一致。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 详解Spring中Bean的生命周期和作用域及实现方式

    前言 在applicationContext.xml中配置完bean之后,Bean的声明周期状态有哪些.生命周期的各个阶段可以做什么.在applicationContext.xml配置bean的作用域有哪些.其中各个作用域代表的是什么.适用于什么情况.这篇文章做一个记录. 生命周期 初始化 可以直接查看图片,图片来自Spring Bean Life Cycle 从上图看出,Bean初始化完成包括9个步骤.其中一些步骤包括接口的实现,其中包括BeanNameAware接口,BeanFactoryA

  • spring之Bean的生命周期详解

    Bean的生命周期: Bean的定义--Bean的初始化--Bean的使用--Bean的销毁 Bean的定义 Bean 是 spring 装配的组件模型,一切实体类都可以配置成一个 Bean ,进而就可以在任何其他的 Bean 中使用,一个 Bean 也可以不是指定的实体类,这就是抽象 Bean . Bean的初始化 Spring中bean的初始化回调有两种方法 一种是在配置文件中声明init-method="init",然后在一个实体类中用init()方法来初始化 另一种是实现Ini

  • Spring生命周期回调与容器扩展详解

    本篇主要总结下Spring容器在初始化实例前后,提供的一些回调方法和可扩展点.利用这些方法和扩展点,可以实现在Spring初始化实例前后做一些特殊逻辑处理. 下面主要介绍: 类级别的生命周期初始化回调方法init-method配置.InitializingBean接口和PostConstruct注解 容器级别的扩展BeanPostProcessor接口和BeanFactoryPostProcessor接口 1.类级别生命周期回调 1.1init-method 参照:Springbeanxsdin

  • springMVC的生命周期详解

    springMVC的生命周期,听到的时候都没有反应过来,springMVC还有生命周期?现在看来生命周期就是springMVC的流程,SpringMVC是MVC思想的一种实现,下面看一下MVC思想的流程图: MVC的核心思想如上图,那么springMVC是如何实现MVC的思想的呢? 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping(处理器映射器)查找 Handler 可以根据xml配置.注解进行查找 第三步:处理器映射器Han

  • 详解Spring中bean生命周期回调方法

    生命周期回调方法 对于spring bean来讲,我们默认可以指定两个生命周期回调方法.一个是在ApplicationContext将bean初始化,包括注入对应的依赖后的回调方法:另一个是在ApplicationContext准备销毁之前的回调方法.要实现这种回调主要有三种方式:实现特定的接口.在XML配置文件中指定回调方法和使用JSR-250标准的注解. 1 实现特定接口 针对bean初始化后的回调和ApplicationContext销毁前的回调,Spring分别为我们了提供了Initia

  • Spring配置使用之Bean生命周期详解

    基本概念 Spring 中的 Bean 的生命周期,指的是 Bean 从创建到销毁的过程. 下面来探究下几个有关 Bean 生命周期配置的属性. lazy-init lazy-init 表示延迟加载 Bean,默认在 Spring IoC 容器初始化时会实例化所有在配置文件定义的 Bean,若启用了 lazy-init 则在调用 Bean 时才会去创建 Bean. 定义 Bean: public class Animals { public Animals(){ System.out.print

  • 浅谈Spring bean 生命周期验证

    一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware setBeanName 设置bean名称 2.BeanClassLoaderAware setBeanClassLoader 设置bean类加载器 3.BeanFactoryAware setBeanFactory 设置bean工厂 4.EnvironmentAware setEnvironment

  • 深入理解Spring中bean的生命周期介绍

    1.以ApplocationContext上下文单例模式装配bean为例,深入探讨bean的生命周期: (1).生命周期图: (2).具体事例: person类实现BeanNameAware,BeanFactoryAware接口 public class Person implements BeanNameAware ,BeanFactoryAware{ private String name; public Person(){ System.out.println("调用构造器为属性值初始化&

  • Spring学习笔记之bean生命周期

    前言 上一篇文章主要学习了下bean的配置.注入.自定义属性编辑器,今天来熟悉bean的生命周期. 任何一个事物都有自己的生命周期,生命的开始.生命中.生命结束.大家最熟悉的应该是servlet 的生命周期吧.和 servlet 一样 spring bean 也有自己的生命周期. 在开发中生命周期是一个很常见的名词,基本每种编程语言都能找到与它关联的.关于bean的生命周期我在网上也找了好多,基本都差不多.这里我主要是想通过代码来验证,毕竟学的知识都是一样的,都是学的Java,最重要的是动手练习

  • 关于Spring启动流程及Bean生命周期梳理

    目录 Spring启动流程及Bean生命周期梳理 中间连线为refresh方法中每个方法所对应执行Bean的生命周期 关键类和接口继承图 Spring启动流程及Bean生命周期梳理 Spring的启动本身就伴随着Bean的生命周期的开始,为了搞清楚Spring启动的每一步都干了什么,并且这一步对Bean的加载进行了什么操作,我画了下面图进行了一一对应,并把关键类和接口的继承图列了出来. 左边流程为refresh方法,即Spring启动必经的主要方法,每个节点为该方法的一个内部方法,方法旁均有标注

  • Spring学习笔记之bean的基础知识

    Bean: 在Spring技术中是基于组件的 最基本了是最常用的单元 其实实例保存在Spring的容器当中 Bean通常被定义在配置文件当中,Bean实例化由Spring的Ioc容器进行管理,Bean的实例可以通过Beanfactory进行访问,实际上大部分J2EE应用,Bean是通过ApplicationContext来访问的,ApplicationContext是BeanFactory的子接口,功能要比BeanFactory强大许多 在前面得博客依赖注入与控制反转中演示了应用spring实现

  • Spring Bean生命周期源码原理图解

    概述 spring流行了很长时间了,是一个用java编写的轻量级框架,受到了很多公司及程序员的欢迎,Bean生命周期是一个对象从实例化开始到销毁的全过程,了解生命周期是很有必要的. 重要性 spring的生命周期是比较复杂的,只有了解其过程及原理才能更好的扩展程序. 源码剖析生命周期过程bean的实例化 属性填充及Aware接口检测设置依赖 如果容器自定义了BeanpostProcessor的实现类,则执行处理器相应的前置处理 bean实现了初始化接口InitlializingBean,则会执行

  • 谈谈我对Spring Bean 生命周期的理解

    前言 Spring的ioc容器功能非常强大,负责Spring的Bean的创建和管理等功能.而Spring 的bean是整个Spring应用中很重要的一部分,了解Spring Bean的生命周期对我们了解整个spring框架会有很大的帮助. BeanFactory和ApplicationContext是Spring两种很重要的容器,前者提供了最基本的依赖注入的支持,而后者在继承前者的基础进行了功能的拓展,例如增加了事件传播,资源访问和国际化的消息访问等功能.本文主要介绍了ApplicationCo

  • 深入了解Spring的Bean生命周期

    目录 源码下载 什么是 Spring Bean 的生命周期 Bean的生命周期 Spring角度查看bean的定义与注册 SpringBoot角度查看bean定义和注册 实例化,依赖注入,初始化 Bean的生命周期的扩展点 Bean级别 容器级别 常用接口 InstantiationAwareBeanPostProcessor BeanNameAware BeanFactoryAware ApplicationContextAware BeanPostProcessor Initializing

  • Spring Bean生命周期详细分析

    目录 前言 一.Bean的介绍 什么是Bean Bean的生命周期 Bean的作用域 二.详细过程 1. Bean的实例化 2. InstantiationAwareBeanPostProcessor 3. 设置属性(依赖注入) 4. 注入Aware接口 5. BeanPostProcessor的postProcessBeforeInitialzation方法 6. InitializingBean与init-method 7. BeanPostProcess的postProcessAfterI

  • 全面详解Spring Bean生命周期教程示例

    目录 Spring 中 Bean 的生命周期 Bean 的实例化 构造方法注入 工厂方法注入 Bean 的属性赋值 setter注入 构造方法注入 Bean 的初始化 初始化方法 InitializingBean 接口 Bean 的销毁 销毁方法 DisposableBean 接口 总结 Spring 中 Bean 的生命周期 是当今最流行的 Java 开发框架之一,其强大的 Bean容器机制是其中的核心之一.Bean 是指在 Spring 容器中被管理的对象,它们可以被注入到其他对象中,也可以

随机推荐