我们首先来看下面的一个案例:

这里是 HelloWorld.java 文件的内容:

package com.yiibai;
  
public class HelloWorld {
  private String message;
  
  public void setMessage(String message){
   this.message = message;
  }
  
  public void getMessage(){
   System.out.println("Your Message : " + message);
  }
  
  public void init(){
   System.out.println("Bean is going through init.");
  }
  
  public void destroy(){
   System.out.println("Bean will destroy now.");
  }
}

这是实现BeanPostProcessor,之前和之后的任何bean的初始化它打印一个bean的名字非常简单的例子

这里是InitHelloWorld.java文件的内容:

package com.yiibai;
  
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.BeansException;
  
public class InitHelloWorld implements BeanPostProcessor {
   
  public Object postProcessBeforeInitialization(Object bean,
         String beanName) throws BeansException {
   System.out.println("BeforeInitialization : " + beanName);
   return bean; // you can return any other object as well
  }
  
  public Object postProcessAfterInitialization(Object bean,
         String beanName) throws BeansException {
   System.out.println("AfterInitialization : " + beanName);
   return bean; // you can return any other object as well
  }
  
}
 

以下是MainApp.java 文件的内容。在这里,需要注册一个关闭挂钩registerShutdownHook() 是在AbstractApplicationContext类中声明的方法。这将确保正常关闭,并调用相关的destroy方法。

package com.yiibai;
  
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
  
public class MainApp {
  public static void main(String[] args) {
  
   AbstractApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");
  
   HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
   obj.getMessage();
   context.registerShutdownHook();
  }
}
 

下面是init和destroy方法需要的配置文件beans.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
  
  
  <bean id="helloWorld" class="com.yiibai.HelloWorld"
    init-method="init" destroy-method="destroy">
    <property name="message" value="Hello World!"/>
  </bean>
  
  <bean class="com.yiibai.InitHelloWorld" />
  
</beans>
 

创建源代码和bean配置文件完成后,让我们运行应用程序。如果一切顺利,这将打印以下信息:

BeforeInitialization : helloWorld
Bean is going through init.
AfterInitialization : helloWorld
Your Message : Hello World!
Bean will destroy now.

我们来看下spring管理bean的生命周期:

在对应未初始化之前先调用 postProcessBeforeInitialization方法

然后对bean进行初始化,通过set方法设置对象的成员属性之后,对象就初始化完成。这里对象实现了InitialingBean接口,就会执行接口方法afterPropertsets方法。该方法在bean所有属性的set方法执行完毕后执行。是bean初始化成功的标志位,表示bean初始化接受

bean初始化成功之后,如果设置了init-method属性就执行该bean对象的方法

接下来执行postProcessAfterInitialization

最后执行destroy-method方法。

我们来看bean的生命周期的执行过程

第二点:bean后处理器的作用

Bean后处理器的基本要求是实现BeanPostProcessor接口。通过实现postProcessBeforeInitialization() 和 postProcessAfterInitialization() 方法,可以在初始化回调方法前后处理所有Bean。可以实现对指定

bean对应方法的业务进行增强

Spring声明周期的学习心得的更多相关文章

  1. Spring Framework------>version4.3.5----->Reference学习心得----->总结

    1.Spring Framework概述: 有很多可用版本,网址http://projects.spring.io/spring-framework/       2.Spring Framework ...

  2. spring源码学习(四)-spring生命周期用到的后置处理器

    生命周期的九大后置处理器 第一次调用后置处理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory# ...

  3. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->关于spring framework中的beans

    Spring framework中的beans 1.概述 bean其实就是各个类实例化后的对象,即objects spring framework的IOC容器所管理的基本单元就是bean spring ...

  4. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用Spring Framework开发自己的应用程序

    1.直接基于spring framework开发自己的应用程序: 1.1参考资料: Spring官网spring-framework.4.3.5.RELAESE的Reference Documenta ...

  5. React学习笔记(五)State&声明周期

    React学习笔记(五) 四.State&声明周期 可以为组件添加"状态(state)".状态与属性相似,但是状态是私有的,完全受控于当前组件. 局部状态就是只能用于类(定 ...

  6. [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. Spring学习总结(4)-Spring生命周期的回调

    参考文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans ...

  8. SpringMvc学习心得(五)控制器产生与构建

    SpringMvc学习心得(五)控制器产生与构建 标签: springspring mvc框架 2016-03-22 15:29 140人阅读 评论(0) 收藏 举报  分类: Spring(4)  ...

  9. windows类书的学习心得(转载)

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

随机推荐

  1. java方式实现基数排序

    一.基数排序描述 基数排序(radix sort)属于"分配式排序"(distribution sort),又称"桶子法"(bucket sort)或bin s ...

  2. 注解@NotNull/@NotEmpty/@NotBlank

    @NotNull:不能为null,但可以为empty @NotEmpty:不能为null,而且长度必须大于0 @NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度 ...

  3. Java 第十一届 蓝桥杯 省模拟赛 字母重新排列

    字母重新排列 题目 问题描述 将LANQIAO中的字母重新排列,可以得到不同的单词,如LANQIAO.AAILNOQ等,注意这7个字母都要被用上,单词不一定有具体的英文意义. 请问,总共能排列如多少个 ...

  4. Java实现 LeetCode 397 整数替换

    397. 整数替换 给定一个正整数 n,你可以做如下操作: 如果 n 是偶数,则用 n / 2替换 n. 如果 n 是奇数,则可以用 n + 1或n - 1替换 n. n 变为 1 所需的最小替换次数 ...

  5. 哪些年,我们玩过的Git

    作者:玩世不恭的Coder公众号:玩世不恭的Coder时间:2020-06-05说明:本文为原创文章,未经允许不可转载,转载前请联系作者 哪些年,我们玩过的Git 前言一.前期工作常用基本概念的理解G ...

  6. 汇编指令mov、add、sub、jmp

    mov:寄存器,数据 mov:寄存器,寄存器 mov:寄存器,内存单元 mov:段寄存器,内存单元 mov:内存单元,寄存器 mov:内存单元,段寄存器 mov:段寄存器,寄存器 mov:寄存器,段寄 ...

  7. list基本运用

    #include<iostream> #include<list> using namespace std; list<int>list1,list2; void ...

  8. UBoot配置编译及Makefile分析

    一. UBoot配置编译初步分析 1. UBoot源码结构 (1)UBoot工程项目中的文件可以分为3类 ① 第1类目录:与处理器体系结构或开发板硬件直接相关 ② 第2类目录:一些通用的函数或驱动程序 ...

  9. R调用python模块

    明明已经安装了sctransfer,但仍然显示没有该模块 Error in py_module_import(module, convert = convert) : ModuleNotFoundEr ...

  10. 学习ASP.NET Core(10)-全局日志与xUnit系统测试

    上一篇我们介绍了数据塑形,HATEOAS和内容协商,并在制器方法中完成了对应功能的添加:本章我们将介绍日志和测试相关的概念,并添加对应的功能 一.全局日志 在第一章介绍项目结构时,有提到.NET Co ...