本文代码GitHub地址

Bean的生命周期是开始创建到销毁的过程。需要实现相关的类BeanNameAware   ,DisposableBean, InitializingBean ,并注册InstantiationAwareBeanPostProcessor。

Bean类实现BeanNameAware   ,DisposableBean, InitializingBean 接口

  1. package com.bean.life.entity;
  2.  
  3. import org.springframework.beans.BeansException;
  4. import org.springframework.beans.factory.*;
  5. import org.springframework.stereotype.Component;
  6.  
  7. @Component
  8. public class User implements BeanFactoryAware
  9. , BeanNameAware
  10. , InitializingBean
  11. , DisposableBean
  12. {
  13. @Override
  14. public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
  15. System.out.println("BeanFactoryAware setBeanFactory");
  16. }
  17.  
  18. @Override
  19. public void setBeanName(String s) {
  20. System.out.println("BeanNameAware接口: setBeanName = " + s);
  21. }
  22.  
  23. @Override
  24. public void afterPropertiesSet() throws Exception {
  25. System.out.println("InitializingBean接口: afterPropertiesSet");
  26. }
  27.  
  28. @Override
  29. public void destroy() throws Exception {
  30. System.out.println("DisposableBean接口: destroy");
  31.  
  32. }
  33. @PostConstruct
  34. public void init(){
  35. System.out.println("PostConstruct");
  36. }
  37.  
  38. @PreDestroy
  39. public void destory(){
  40. System.out.println("PreDestroy");
  41. }
  42. }

注册InstantiationAwareBeanPostProcessor接口。

这里的InstantiationAwareBeanPostProcessorAdapter是 InstantiationAwareBeanPostProcessor 的子孙类。

  1. package com.bean.life.entity;
  2.  
  3. import org.springframework.beans.BeansException;
  4. import org.springframework.beans.PropertyValues;
  5. import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
  6. import org.springframework.stereotype.Component;
  7.  
  8. import java.beans.PropertyDescriptor;
  9. import java.lang.reflect.Constructor;
  10.  
  11. @Component
  12. public class MyInstantiationAwareBeanPostProcessor extends
  13. InstantiationAwareBeanPostProcessorAdapter {
  14.  
  15. public MyInstantiationAwareBeanPostProcessor() {
  16. super();
  17. }
  18.  
  19. @Override
  20. public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
  21.  
  22. if(beanName.equals("user")){
  23. System.out.println("MyInstantiationAwareBeanPostProcessor接口: determineCandidateConstructors: " + beanName);
  24. }
  25.  
  26. return super.determineCandidateConstructors(beanClass, beanName);
  27. }
  28.  
  29. @Override
  30. public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
  31. if(beanName.equals("user")){
  32. System.out.println("MyInstantiationAwareBeanPostProcessor接口: getEarlyBeanReference: " + beanName);
  33. }
  34.  
  35. return super.getEarlyBeanReference(bean, beanName);
  36. }
  37.  
  38. @Override
  39. public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
  40. if(beanName.equals("user")){
  41. System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInstantiation: " + beanName);
  42. }
  43.  
  44. return super.postProcessBeforeInstantiation(beanClass, beanName);
  45. }
  46.  
  47. @Override
  48. public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
  49. if(beanName.equals("user")){
  50. System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessAfterInstantiation : " + beanName);
  51. }
  52.  
  53. return super.postProcessAfterInstantiation(bean, beanName);
  54. }
  55.  
  56. @Override
  57. public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
  58.  
  59. if(beanName.equals("user")){
  60. System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessPropertyValues: " + beanName);
  61. }
  62. return super.postProcessPropertyValues(pvs, pds, bean, beanName);
  63. }
  64.  
  65. @Override
  66. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  67. if(beanName.equals("user")){
  68. System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInitialization: " + beanName);
  69. }
  70.  
  71. return super.postProcessBeforeInitialization(bean, beanName);
  72. }
  73.  
  74. @Override
  75. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  76. if(beanName.equals("user")){
  77. System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessAfterInitialization: " + beanName);
  78. }
  79.  
  80. return super.postProcessAfterInitialization(bean, beanName);
  81. }
  82. }

输出

  1. MyBeanFactoryPostProcessor --- BeanFactoryPostProcessor
  2. MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInstantiation: user
  3. MyInstantiationAwareBeanPostProcessor接口: determineCandidateConstructors: user
  4. MyInstantiationAwareBeanPostProcessor接口: postProcessAfterInstantiation : user
  5. MyInstantiationAwareBeanPostProcessor接口: postProcessPropertyValues: user
  6. BeanNameAware接口: setBeanName = user
  7. BeanFactoryAware setBeanFactory
  8. MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInitialization: user
  9. PostConstruct
  10. InitializingBean接口: afterPropertiesSet
  11. MyInstantiationAwareBeanPostProcessor接口: postProcessAfterInitialization: user
  12.  
  13. PreDestroy
  14. DisposableBean接口: destroy

生命周期图解

Spring 实现按 init-method 和destory-method的三种方式

  • 方式1:xml配置方式
  1. package com.bean.life.entity;
  2.  
  3. public class User
  4. {
  5.  
  6. public void init(){
  7. System.out.println("PostConstruct");
  8. }
  9.  
  10. public void destory(){
  11. System.out.println("PreDestroy");
  12. }
  13. }
  1. <bean id="user" class="com.bean.life.entity" init-method="init" destroy-method="destroy">
  2. </bean>
  • 方式2:注解配置

添加@PostConstruct 和@PreDestroy进行指定

  1. package com.bean.life.entity;
  2.  
  3. @Component
  4. public class User
  5. {
  6.  
  7. @PostConstruct
  8. public void init(){
  9. System.out.println("PostConstruct");
  10. }
  11.  
  12. @PreDestroy
  13. public void destory(){
  14. System.out.println("PreDestroy");
  15. }
  16. }
  • 方式3: 使用注解@Bean
  1. public @interface Bean {
  2. @AliasFor("name")
  3. String[] value() default {};
  4.  
  5. @AliasFor("value")
  6. String[] name() default {};
  7.  
  8. Autowire autowire() default Autowire.NO;
  9.  
  10. String initMethod() default "";
  11.  
  12. String destroyMethod() default "(inferred)";
  13. }
  1. @Configuration
  2. public class UserConfig{
  3.  
  4. @Bean(initMethod="init",destoryMethod="destory")
  5. public User user(){
  6. return new User();
  7. }
  8.  
  9. }

Spring Bean 生命周期测试的更多相关文章

  1. Spring点滴四:Spring Bean生命周期

    Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. -------------------------------- ...

  2. 大厂高频面试题Spring Bean生命周期最详解

    Spring作为当前Java最流行.最强大的轻量级框架.Spring Bean的生命周期也是面试高频题,了解Spring Bean周期也能更好地帮助我们解决日常开发中的问题.程序员应该都知道Sprin ...

  3. Spring Bean生命周期,好像人的一生。。

    大家好,我是老三,上节我们手撸了一个简单的IOC容器五分钟,手撸一个Spring容器!,这节我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像. 简单说说IoC和Bean IoC ...

  4. spring bean 生命周期和 ? 作用域? spirng bean 相互依赖? jvm oom ? jvm 监控工具? ThreadLocal 原理

    1. spring bean 生命周期 1. 实例化一个bean ,即new 2. 初始化bean 的属性 3. 如果实现接口 BeanNameAware ,调用 setBeanName 4. Bea ...

  5. Spring Bean 生命周期之destroy——终极信仰

    上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁? 和 我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去? 初始化 Spring Bean 有三种方式: @P ...

  6. 常见问题:Web/Servlet生命周期与Spring Bean生命周期

    Servlet生命周期 init()初始化阶段 Servlet容器加载Servlet(web.xml中有load-on-startup=1;Servlet容器启动后用户首次向Servlet发请求;Se ...

  7. 睡前聊一聊"spring bean 生命周期"

    spring bean 生命周期=实属初销+2个常见接口+3个Aware型接口+2个生命周期接口 实属初销:spring bean生命周期只有四个阶段,即实例化->属性赋值->初始化-&g ...

  8. Spring Bean 生命周期2

    在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...

  9. Spring bean 生命周期验证

    一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware s ...

随机推荐

  1. 关于Linux虚拟化技术KVM的科普

    虚拟化技术应用越来越广泛,虚拟化技术需求越来越强劲.KVM.XEN.Docker等比较热门,尤其是KVM技术越来越受欢迎. 基于此背景,了解一下KVM+QEMU就有点必要了. 从网上收集了一些资料进行 ...

  2. monkey操作

    1.monkey命令格式 直接adb shell进入后输入monkey [options] <eventcount> 或者每次输入adb shell monkey [options] &l ...

  3. 使用java检测网络连接状况

    windows中可以通过在cmd中使用ping命令来检测网络连接状况,如下: 网络连接正常时: 网络未连接时: 在java中可以通过调用ping命令来判断网络是否连接正常: package modul ...

  4. Android UI性能优化实战 识别绘制中的性能问题

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45556391: 本文出自:[张鸿洋的博客] 1.概述 2015年初google ...

  5. css3绘制三角形

    将div的宽和高设置为0:利用border-width.border-style.border-color属性绘制不同位置边框的样式.将不需要展示的三角颜色填充为transparent透明即可,就能得 ...

  6. 爬虫之scrapy-splash

    什么是splash Splash是一个Javascript渲染服务.它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT.Twisted(QT ...

  7. MySQL 8 新特性之降序索引

    MySQL 8.0终于支持降序索引了.其实,从语法上,MySQL 4就支持了,但正如官方文档所言,"they are parsed but ignored",实际创建的还是升序索引 ...

  8. IZT复杂电磁环境记录回放和模拟系统

    结合实验室复杂电磁环境特性与模拟研究需求,实现对复杂多变的电磁环境录制.分析.重构和模拟,记录回放系统应具备如下几项能力: 1.电磁环境信号记录能力:能够实现对9KHz-18GHz频带范围内射频信号的 ...

  9. conn.go 源码阅读

    ),         Conn: conn,     }     return k, v } // 返回远程节点地址 func (self *Connect) Addr() string {      ...

  10. dirlock_windows.go

    package dirlock type DirLock struct {     dir string } func New(dir string) *DirLock {     return &a ...