美文网首页
spring源码

spring源码

作者: 阿不不不不 | 来源:发表于2019-05-27 11:49 被阅读0次
    普通类实例过程:首先会有一个类装载器(classloader)将类装载到内存,jvm的字节码编译器把字节码变异成机器码然后再返回一个class对象就可以用这个对象了 Snip20190525_9.png

    spring如何创建bean

    同样先把java类通过classloader加载到class,Spring容器一启动就会去扫描这些class,将class扫描变成BeanDefinition(用来描述我们的class的),再将BeanDefinition放到一个map中如图绿色框,map中就描述了某个class的信息,spring再通过循环遍历这个map,把map中所有的BeanDefinition拿出来,再通过preinstantiatesingletons方法把BeanDefinition变成一个bean,这个bean会放到spring IOC容器中,最后通过getbean方法拿到bean对象。

    所以spring new一个对象跟class没有关系,跟BeanDefinitionMap有关系

    注意可以人为干预Spring创建bean的过程

    可以通过其中的一个拓展点BeanFactoryPostProcessor这个接口去插手BeanDefinitionMap人为把这个map改了
    BeanFactoryPostProcessor只能修改不能往BeanDefinitionMap添加BeanDefinition

    问题:为什么需要动态注册bean

    大部分时候,静态的配置信息即可满足系统需求。但是某些场景下,我们需要根据静态配置中的信息动态生成bean,此时就需要动态注册bean的功能。
    如:用户定义一个如下的接口,而接口的实现则由框架生成,不需要用户自行编写,此时实现类就需要动态注册到容器中。

    问题:一个接口如何调用一个方法:动态代理或者factorybean

    借助ImportBeanDefinitionRegistrar接口实现bean的动态注入

    A801316CDD066AB3E3CFE7E8E6152721.png Snip20190525_10.png

    相关文章

      网友评论

          本文标题:spring源码

          本文链接:https://www.haomeiwen.com/subject/pkzazqtx.html