spring源码

普通类实例过程:首先会有一个类装载器(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源码)