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

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

bean的创建过程:

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])    org.springframework.beans.factory.support.AbstractBeanFactory#resolveBeanClass    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean        org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance        org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors            org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition        org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean            org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation            org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessProperties            org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#checkDependencies            org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyPropertyValues                org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#convertForProperty                    org.springframework.beans.TypeConverter#convertIfNecessary(java.lang.Object, java.lang.Class
, org.springframework.core.MethodParameter)        org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)            org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods                org.springframework.beans.factory.BeanNameAware#setBeanName                org.springframework.beans.factory.BeanClassLoaderAware#setBeanClassLoader                org.springframework.beans.factory.BeanFactoryAware#setBeanFactory            org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization                org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization            org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods                org.springframework.beans.factory.InitializingBean#afterPropertiesSet            org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization                org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization

            

1 FactoryBean

    重写三个方法,一个getObject,getObjectType,isSingleton
    FactoryBean是懒加载的
    
    factorybean对应的单例不是spring容器启动的时候生成的,是调用getBean的时候生成的。
    spring启动后,会再单利池中增加一个以FactoryBean名字首字母小写为名称的bean
    要获取factoryBean实例,在名称前面增加&符号
    

    获取bean后会调用getObjectForBeanInstance方法,这个方法中会判断是不是factorybean

    获取到factorybean后,getObjectForBeanInstance中会判断是否是factorybean,如果不是就直接返回。如果是,就强制转换成FactoryBean,然后先从缓存(key为bean的名称,value是对象实例)中获取。获取时,先判断是否是单例,在调用getObject。
    factoryBean生成的单例不会放到单例池中
    spring整合mybatis就是通过factorybean实现的。是在getObject的时候生成一个接口类型的代理对象
    
    与beanfactory的区别:
        factorybean是由beanfactory生成的。
        factorybean只能生成一中类型的对象实例,beanfactory可以生成多个
        beanfactory除了可以获取实例外还有好多功能方法。
2 bean的生命周期
    扫描
        扫描时没有加载类,怎么判断有没有@Component注解,是asm解析得到的
    生成beandefinitio
        生成genericBeanDefinition 存放到beanDefinitionMap中
    合并beandefinitio
        先全mergementBeanDefinitionMap中查找,如果没找到在从beanDefinitionMap拿到后合并
        合并后的beandefinition都是rootbeandefinition
    加载类
    实例化前

           可实现接口InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation在spring容器实例化前进行实例化,如果这里返回的值非null,则跳过spring容器的实例化,初始化等步骤,直接转到初始化后。

            可实现接口InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation在spring容器实例化后做处理。

    推断构造方法

            postProcessProperties方法:在工厂将给定的属性值应用于给定的bean之前对其进行后期处理,而不需要属性描述符

    实例化
    beandenition的后置处理
    填充属性
    执行Aware
    初始化前
    初始化后
    
    
    要判断是不是factorybean  SmartFactoryBean
    FactoryBean是懒加载的,SmartFactoryBean.isEagerInit 返回true也不会懒加载
    getBean的时候,先从beanfactory中查找,如果没找到再从父beanfactory中查找,如果还找不到再创建bean
    @Dependson 注解表示依赖某些bean,需要先有依赖的bean才能创建当前bean 
    @Dependson 互相注解造成的回
    
    循环依赖:是通过两个map判断的
        dependenciesForBeanMap
        dependentBeanMap
    bean的作用域:单例,原型,request,session。request,session和scope接口有关系
        
        RequestScope  Abstract         生成的对象存储在 request.getAtrribute().get("beanName") 中
        SessionScope
    docreateBean spring自带的创建bean的方法
    resolveBeforeInstantation 这个方法中可以创建bean,不用spring自带的创建bean方法。这个方法中会判断是否有实例化前处理器。所有的bean都会调用这个方法。

    

    问题:

    使用resolveBeforeInstantation创建的是不是就不调用aware了?是的。直接从实例化前跳到初始化后。
    aop是在初始化后执行的

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

你可能感兴趣的文章
Python模块之---Pexpect
查看>>
Python的Pexpect详解
查看>>
Python模块:optparse 处理命令行参数
查看>>
supervisor安装配置与使用
查看>>
全文索引原理及范例
查看>>
Django运行方式及处理流程总结
查看>>
今天有个好玩的东西,ubuntu下的rar
查看>>
VIM-CTAGS-CSCOPE(持续学习中)
查看>>
proc文件学习(持续学习中)
查看>>
kmsg的学习
查看>>
linux文件分类--以颜色和符号分类(ls时)
查看>>
linux下find查找文件
查看>>
linux设备节点
查看>>
ls -l的时候最前面的一堆字符所代表的文件的权限和权限的修改
查看>>
使用git和repo管理自己的android代码
查看>>
关于Linux下的umask
查看>>
linux下 ls命令例子与解释
查看>>
学习采用Ubuntu软件包管理器
查看>>
Ubuntu 想看chm文件吗?需要安装软件O。
查看>>
安装星际译王
查看>>