spring源码
2019-05-27 本文已影响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的功能。
如:用户定义一个如下的接口,而接口的实现则由框架生成,不需要用户自行编写,此时实现类就需要动态注册到容器中。