前言

当你使用spring越来越熟练的时候,
可能想为了更好地提高自己
去翻spring的源码
可以看源码,但是我不建议细读
因为这些代码要完成任务需要很多琐碎的类实现
比如读取某个包下面的所有类,解析class的头文件,反射各种信息,再加上封装
很有可能在读源码的过程中掉到各种细节里出不来
所以读这种源码要事无巨细,理解原理即可

基本原理

spring依赖注入的基本实现就是:
通过java的反射去解析得到类和类的相关信息:比如构造器,方法,参数...
然后将其封装成bean定义信息类、constructor信息类、method信息类、property信息类...
最终将这些放在一个map里,也就是所谓的container,池...

配置完之后,我们开始启动项目:
启动项目时框架会按照你的配置找到需要扫描的包
解析包里面所有的类,找到所有含有@Bean,@service等注解的类
利用java反射机制解析它们,包括构造函数,方法,属性...
然后封装各种信息到一个map里
每当你需要一个bean的时候,框架就会从container找是不是有定义这个类
如果找到则通过构造器new出来(这就是控制反转理念,不用你去new,框架会帮你new)
再在这个类里面找有没有要注入的属性或者方法:比如标有@Autowired的属性
如果找到则到container中找到对应的解析类:
new出对象,并通过之前解析出来的信息找到setter方法,然后用该方法注入对象(这就是依赖注入)
如果其中有一个类没有找到
spring就会抛出异常:比如常见的无法wire的异常...

还有就是嵌套bean则用了一下递归
container会放到servletcontext里面
每次reQuestion从servletcontext找到这个container即可
不用多次解析类定义

如果bean的scope是singleton
则会重用这个bean不再新创建
将这个bean放到一个map里
每次都会先去这个map里找

如果scope是session
则该bean会放到session里面

以上就是springIoc运行bean的原理(此篇转载自知乎)
觉得还可以的请点个赞,赞不了也可以收藏下;
总之,谢谢阅读~


大叔一枝花
610 声望56 粉丝

Talk is cheap,show me the code