• 请谈一下spring bean的生命周期


    推荐一篇详细介绍spring bean的博客:点击这里 

    我们通常使用ApplicationContext作为Spring容器。这里,我们讲的也是 ApplicationContext中Bean的生命周期。而实际上BeanFactory也是差不多的,只不过处理器需要手动注册。

      (1).实例化bean:

        对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候,需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化,对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean.

      (2).设置对象属性(依赖注入):

        实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息,以及通过BeanWrapper提供的设置属性的接口完成依赖注入.

      (3).处理Aware接口:

        接着,Spring会检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:

          1.如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是Spring配置文件中的id值.

          2.如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是spring工厂自身

          3.如果这个Beany已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入spring上下文

      (4).BeanPostProcessor:

        如果想对bean进行一些自定义的处理,那么可以让bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object object,String s)方法.

      (5).InitializingBean 与 init-method:

        如果bean在spring配置文件中配置了init-method属性,则会自动调用其配置的初始化方法.

      (6).如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object object,String s)方法,由于这个方法是在Bean的初始化结束时调用的,所以可以被应用于内存或缓存技术;

      以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了.

      (7).DisposableBean:

        当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;

      (8)destroy-method:

        最后,如果这个bean的spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法.

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      Spring的生命周期:

      1.Bean容器找到配置文件中Spring Bean的定义.

      2.Bean容器利用Java Reflection API创建一个bean实例.

      3.如果涉及到一些属性值,利用set()方法设置属性值.

      4.如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字.

      5.如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例.

      6.如果Bean实现了BeanFactoryAware接口,调用setBeanClassFactory()方法,传入ClassLoader对象的实例.

      7.与上面的类似,如果实现了其他的*Aware接口,就调用相应的方法.

      8.如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessBeforeInitialization()方法.

      9.如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法.

      10.如果Bean在配置文件中的定义包含init-method属性,执行指定方法.

      11.如果有喝加载这个Bean的Spring容器相关的BeanPostProcess对象,执行postProcessAfterInitialization()方法.

      12.当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法.

      13.当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法.

     

  • 相关阅读:
    Spring中的BeanUtils与apache commons中的BeanUtils用法[1]
    C# rmi例子
    跨时钟域设计的一点总结
    FPGA跨时钟域异步时钟设计的几种同步策略-可编程逻辑-与非网
    关于FPGA异步时钟采样--结绳法的点点滴滴
    sigaction函数解析
    可重入函数
    SCHED_OTHER,SCHED_FIFO,SCHED_RR-intentness-ChinaUnix博客
    qt安装教程
    VS2013 平台下搭建 QT5.3 开发环境
  • 原文地址:https://www.cnblogs.com/wk-missQ1/p/12600246.html
Copyright © 2020-2023  润新知