zoukankan      html  css  js  c++  java
  • 面试知识点总结之SpringBean的生命周期管理

    理解SpringBean的生命周期可以让你更好的掌控自己的项目:
    首先要知道的是普通Java对象和Spring所管理的Bean实例化的过程是有些区别的。
    在普通的Java环境下创建对象简单的步骤可以分为以下几步:

    1. Java源码被编译为class文件 2. 等到类需要被初始化的时(比如new,反射等) 3. class文件被虚拟机通过类加载器加载到JVM 4. 初始化对象供我们使用
      简单来说,可以理解为它是用class对象作为【模板】进而创建具体的实例
      而Spring所管理的Bean不同的是,除了class对象外,还会使用BeanDefinition的实例来描述对象的信息
      比如说,我们可以在Spring所管理的bean有一系列的描述:@Scope @Lazy @DependsOn等等
      可以理解为:Class只描述了类的信息,而BeanDefinition描述了对象的信息

    Spring在启动的时候需要【扫描】在XML/JavaConfig中需要把这些信息放到一个beanDefinitionMap中;这个Map的key是beanName,value是BeanDefinition对象
    到这里就是把定义的元数据加载起来,目前真实对象还没有实例化

    接着会遍历这个beanDefinitionMap,执行BeanFactoryPostProcessor这个Bean工厂后置处理器的逻辑
    比如说,我们平时定义的占位符信息,就是通过BeanFactoryPostProcessor的子类PropertyPlaceholderConfigurer进行注入进去
    当然了,这里我们也可以自定义BeanFactoryPostProcessor来对我们自定义好的Bean元数据进行获取和修改
    只是我们一般不会这么干,实际上也很少使用场景
    BeanFactoryPostProcessor后置处理器执行完了以后就到了实例化对象啦

    在Spring里边是通过反射来实现的,一般情况下会通过反射选择合适的构造器来把对象实例化
    这里把对象实例化,只是把对象给创建出来,而对象具体的属性是还没有注入的

    比如我的对象是UserService,而UserService对象依赖者SendService对象,这时候的SendService还是Null的,所以下一步就是把对象的相关属性给注入
    相关属性注入之后,往下接着就是初始化的工作了

    首先判断该Bean是否实现了Aware相关的接口,如果存在则填充相关的资源
    比如我这边项目用到的:希望通过代码程序的方式去获取指定的SpringBean
    我们这边会抽取一个工具类,去实现ApplicationContextAware接口,来获取ApplicationContext对象进而获取SpringBean
    Aware相关的接口处理完之后,就会到BeanPostProcessor后置处理器啦

    BeanPostProcessor后置处理器有两个方法,一个是before,一个是after,肯定是before先执行after后执行
    这个BeanPostprocessor后置处理器是AOP实现的关键
    关键子类AnotationAwareAspectJAutoCreator
    所以执行完Aware相关的接口就会执行BeanPostProcessor相关子类的before方法

    BeanPostProcessor相关子类的before方法执行完,则执行init相关的方法,比如说@PostConstruct,实现了InitializingBean接口,定义的initmethod方法
    官网上他们被调【执行顺序】分别是:@PostConstruct,实现了InitializingBean接口以及init-method方法
    这些都是Spring给我们的【扩展】像@postConstruct我就经常用到
    比如说:对象实例化后,我要做些初始化相关的工作或者就启个线程去kafka拉取数据
    等到init方法执行完之后,就会执行BeanPostProcessor的After方法

    基本重要的流程已经走完了,我们就可以获取到对象去使用了
    销毁的时候就看有没有配置相关的destory方法,执行就可以了

    摘自微信公众号Java3y;

  • 相关阅读:
    Linux下date命令,格式化输出,时间设置
    Linux scp复制文件,不需要输入密码的技巧
    Linux中cp和scp命令的使用方法
    Linux定时任务系统 Cron
    Eclipse启动Tomcat后无法访问项目
    eclipse下tomcat插件配置说明
    RPM方式安装MySQL5.6和windows下安装mysql解压版
    shell script练习
    Eclipse Java注释模板设置详解
    mysql备份还原数据库
  • 原文地址:https://www.cnblogs.com/cgy-home/p/14522398.html
Copyright © 2011-2022 走看看