博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bean创建的生命周期步骤
阅读量:2288 次
发布时间:2019-05-09

本文共 2828 字,大约阅读时间需要 9 分钟。

1. Bean创建的生命周期步骤

    1.1加载类

        resovleBeanClass(beanname,bedefinition)来加载类
        BeanDefinition 的beanClass 是Object 类型(存的是类的全限定名或class),因为扫描后,通过ASM技术,解析字节码得到calss名称,这里只存放类的全路径名
            doResolveBeanClass 
                得到类加载器
                得到类的全限定名
                ClassUtils.forName(className,dynamicClassLoader)
                    Class.forName
        是用那个类加载器加载的:默认是ClassUtils.getDefaultClassLoader(),里面获取的是当前线程的类加载器,获取的是AppClassLoader。如果获取不到就获取加载ClassUtils类的加载器(如果这个类是Bootstrap类加载器加载的话,这里获取的也是null);如果获取不到,就再获取系统的类加载器ClassLoader.getSystemClassLoader(),这个类加载器可以通过VM 参数设置。
        如果设置了类加载器,获取的就是设置的类加载器。有两种设置方法,1,Thread.currentThread().setContextClassLoader(*);2,BeanFactory.setBeanClassLoader.
        优先级:BeanFactory.setBeanClassLoader  --->Thread.currentThread().setContextClassLoader --->加载ClassUtils类的加载器 --->ClassLoader.getSystemClassLoader()
        

    1.2实例化前

org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation

    1.3实例化

    =====================这里用org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition 处理BeanDefinition
        可以在这里扫描依赖注入点
            扫描注入点: 是在MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()中完成的
            先找本身类的注入点:
                先找属性注入点 : 如果有@Autowired,@Value,@Inject 三个注解中的一个就注解
                再找方法的注入点
            再找父类的注入点
                属性注入点
                方法注入点

    1.4实例化后

org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation

   

    1.5属性赋值

        spring 原本的属性填充

    1.6填充属性后

org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessProperties

        @Autowired @Resource @Value是在这里解析的
            依赖注入点注入 : 是在属性填充后的    InstantiationAwareBeanPostProcessor.postProcessProperties()中完成的。
            属性的依赖注入:根据feild生成一个DependencyDescriptor,然后调用resolveDenpency。
            方法上的依赖注入:把每一个参数都生成一个DependencyDescriptor,然后调用resolveDenpency。

    1.7Aware

    1.8初始化前

 

        org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization

        ApplicationContextAware 是在这里执行的
        @PostConstruct ,是InitDestroyAnnotationBeanPostProcessor中执行的 也是在这里执行的        
        @PostConstruct 优先 InitializingBean#afterPropertiesSet 执行 ,但是会晚于BeanPostProcessor执行,因为PostConstruct 是在CommonAnnotationBeanPostProcessor中解析执行的。而自定义的BeanPostProcessor 会在CommonAnnotationBeanPostProcessor前执行
        
        InitDestroyAnnotationBeanPostProcessor 会通过反射找出所有  @PostConstruct init*** 的初始化方法和@PreDestroy destroy*** 方法,分别放到两个list中。
        

    1.9初始化    

org.springframework.beans.factory.InitializingBean#afterPropertiesSet

        beandefinition设置的初始化方法在org.springframework.beans.factory.InitializingBean#afterPropertiesSet 后执行

    1.10初始化后

              org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization

2. BeanPostProcessor详解

3. Bean销毁的生命周期步骤

问题  
1 这里的依赖的包括 @Autowire 的么
    不包括
2 以#号开头的是spring的表达式
    @Value("#{beanname}") 也可以注入一个bean
    $是占位符
3 给bean对象  设置默认值(int 类型的设置默认值0)是在  属性赋值还是 初始化
    是java的范畴,和spring没有关系
    实例化是赋值默认值 初始化时用具体的值替换掉默认值 这是JAVA的类加载解析
4 代码证明 属性填充和属性填充后 的顺序

5 默认有两个Aware  ApplicationContextAwareProcessor 和 ApplicationEventListenerDetector 

 

转载地址:http://pbbnb.baihongyu.com/

你可能感兴趣的文章
windows必备软件
查看>>
uboot-2011.12移植到S3C2440(序四)—— uboot.lds分析与解析
查看>>
Android社区链接
查看>>
Android Booting
查看>>
Android4.0之init读取init.ic的过程
查看>>
uboot-2011.12移植到S3C2440(二)——点亮LED灯,the very beginning。
查看>>
using strace to follow the startup of zygote
查看>>
Improving Android Boot Time
查看>>
Android - strace runtime
查看>>
Android init language
查看>>
Android Framework Startup
查看>>
Android Initialization Process
查看>>
Using Bootchart on Android
查看>>
Android Logging System
查看>>
The System Server in Android
查看>>
Android Zygote Startup
查看>>
Android Architecture
查看>>
Debugging Android JNI with CheckJNI
查看>>
Python开发工具 Wing IDE
查看>>
ARM微处理器的指令集概述(三)—— .word的含义
查看>>