文章目录

  • 概述
  • 方式一: 自行指定bean的初始化方法和bean的销毁方法
  • 方式二: 通过 InitializingBean和DisposableBean 接口实现bean的初始化以及销毁方法
  • 方式三: 通过JSR250规范 提供的注解@PostConstruct 和@ProDestory标注的方法
  • 方式四:通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程

概述

  • 针对单实例bean的话,容器启动的时候,bean的对象就创建了,而且容器销毁的时候,也会调用Bean的销毁方法
  • 针对原型bean的话,容器启动的时候,bean是不会被创建的而是在获取bean的时候被创建,而且bean的销毁不受 IOC容器的管理.

方式一: 自行指定bean的初始化方法和bean的销毁方法

【beans】

package com.artisan.base.lifeCycle;public class A1 {public void init(){System.out.println("A1 init");}public void destory(){System.out.println("A1 destory");}
}
package com.artisan.base.lifeCycle;public class A2 {public void init(){System.out.println("A2 init");}public void destory(){System.out.println("A2 destory");}
}

【配置类】

package com.artisan.base.lifeCycle;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;@Configuration
public class LCConfig {@Bean(initMethod = "init",destroyMethod = "destory")public A1 a1(){return  new A1();}@Scope("prototype")@Beanpublic A2 a2(){return  new A2();}
}

【测试】

package com.artisan.base.lifeCycle;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.concurrent.TimeUnit;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2020/10/11 22:58* @mark: show me the code , change the world*/
public class LCTest {public static void main(String[] args) throws InterruptedException {AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(LCConfig.class);TimeUnit.SECONDS.sleep(3);// 容器销毁ac.close();}
}


方式二: 通过 InitializingBean和DisposableBean 接口实现bean的初始化以及销毁方法

package com.artisan.base.lifeCycle;import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2020/10/11 23:06* @mark: show me the code , change the world*/
public class A3 implements InitializingBean, DisposableBean {public A3() {System.out.println("A3 init");}@Overridepublic void destroy() throws Exception {System.out.println("A3 destroy");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("A3 afterPropertiesSet");}
}

执行上面的测试代码


方式三: 通过JSR250规范 提供的注解@PostConstruct 和@ProDestory标注的方法

package com.artisan.base.lifeCycle;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2020/10/11 23:12* @mark: show me the code , change the world*/
public class A4 {public A4() {System.out.println("A4 Construct ");}@PostConstructpublic void init(){System.out.println("A4 init");}@PreDestroypublic void destory(){System.out.println("A4 destory");}
}

测试结果


方式四:通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程

public class A5 {public A5() {System.out.println("A5 Construct");}public void init(){System.out.println("A5 init");}public void destory(){System.out.println("A5 destory");}
}

【bean後置處理器】

package com.artisan.base.lifeCycle;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class A5BeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof  A5){System.out.println("A5BeanPostProcessor...postProcessBeforeInitialization:"+beanName);}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof  A5){System.out.println("A5BeanPostProcessor...postProcessAfterInitialization:"+beanName);}return bean;}
}

【config】

【test】

简单说一下 BeanPostProcessor的执行时机


看看invokeInitMethods


Spring5 - Bean的初始化和销毁的4种方式相关推荐

  1. spring-bean生命周期之初始化和销毁的三种方式

    1,注解bean之指定init-method/destroy-method 这种方式spring注解之@Bean注解,这边再简单演示如下: 配置类中增加一个bean如下: /*** 定义一个bean对 ...

  2. spring bean的初始化和销毁

    为什么80%的码农都做不了架构师?>>>    spring bean的初始化和销毁有3种形式: 1.通过注解@PostConstruct 和 @PreDestroy 方法实现初始化 ...

  3. spring Bean的初始化和销毁 (使用注解)

    使用注解定义Bean的初始化和销毁 Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法. 回顾配置文件的写 ...

  4. 面试题------Spring中Bean的初始化以及销毁init-method、destory-method

    面试题------Spring中Bean的生命周期 通过Spring工厂,可以控制bean的生命周期. 在xml中配置Bean的初始化和销毁方法 通过init-method属性指定初始化后的调用方法. ...

  5. 手写Spring-第七章-钩直饵咸?虚拟机钩子与bean的初始化和销毁

    前言 上一次的练习中,我们主要实现了后置处理器,对bean定义以及bean进行了扩展.那个时候留下了一个坑,也就是bean的[初始化],我们是没有内容的.那么这一次,我们就来填上这个坑.不仅如此,有开 ...

  6. ApplicationContext和Bean的初始化和销毁

    本节来学习ApplicationContext和Bean的初始化和销毁 首先看一下ApplicationContext容器的初始化和销毁关闭过程. ApplicationContext启动的过程是在A ...

  7. Spring中bean的初始化和销毁几种实现方式详解

    关联博文:Spring中Bean的作用域与生命周期 Bean的生命周期 : 创建bean对象 – 属性赋值 – 初始化方法调用前的操作 – 初始化方法 – 初始化方法调用后的操作 – --- 销毁前操 ...

  8. spring boot之 Bean的初始化和销毁(4)

    1.java形式的配置方式:使用@bean的initMethod和destorymethod等同于init-method.destory-method java--Bean(还未交给spring管理) ...

  9. spring Bean的初始化和销毁生命周期方法

    使用注解定义Bean的初始化和销毁 Spring初始化bean或销毁bean时,有时需要作一些处理工作,因此spring可以在创建和拆卸bean的时候调用bean的两个生命周期方法. 回顾配置文件的写 ...

最新文章

  1. 自动挂载配置本地yum源
  2. java中的权限修饰符_Java的权限修饰符的区别和用法总结
  3. 熊猫烧香分析报告_熊猫分析进行最佳探索性数据分析
  4. 【K8S】Docker向私有仓库拉取/推送镜像报错(http: server gave HTTP response to HTTPS client)
  5. android支付宝支付开发过程
  6. vue 图片被背景色覆盖_如何使用纯css3打造有点意思的故障艺术(附React/Vue加强组件版)...
  7. 用 Python 分析上网记录,发现了很多不可思议的事
  8. “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛:I. 丢史蒂芬妮
  9. ACS与目录服务器进行用户身份控制管理
  10. 服务器宕机可能的原因以及服务器宕机解决办法
  11. property中的read,write是什么意思?
  12. 自动开票失败可能出现的错误信息
  13. [JNI]开发之旅(7)JNI函数中调用java对象的方法
  14. devops之 --- git可视化工具sourcetree
  15. servlet异步请求
  16. 用Adobe Illustrator将位图转为矢量图并上色
  17. redies基本数据结构
  18. MATLAB全局变量
  19. 图灵工业机器人说明书_从2020世界人工智能大会,看工业机器人领域领军企业布局...
  20. 电路原理 第一章 电路模型和电路定律(一)

热门文章

  1. 第六代微型计算机是,AMD Carrizo第六代A系列处理器技术解析
  2. ubuntu opencv c++ 读取摄像头
  3. Leetcode 203. 移除链表元素 (每日一题 20210914)
  4. 知识图谱学习笔记-PageRank
  5. pytorch笔记 torch.clamp(截取上下限)
  6. pytorch笔记:实例解析NLLLoss和CrossEntropyLoss
  7. Linux 运维故障排查思路,有这篇文章就够了
  8. 深入Python(5):递归
  9. python面向对象和面向过程的区别_Python11-01_面向对象----面向对象和面向过程的区别...
  10. win11+AMD的cpu+3060GPU电脑安装 tensorflow-GPU+cuda11+cudnn