十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Hello!各位小伙伴们,好久不见!距我上一篇文章已经过了7个多月了。以后尽可能的加快更新的进度,下面让我来带大家感受Spring中的Autowired注解的设计之美吧!
目前创新互联公司已为千余家的企业提供了网站建设、域名、网页空间、网站托管、服务器租用、企业网站设计、齐河网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。一、环境本源码是基于jdk1.8、spring5.2.8.RELEASE的环境【特别注意:不同的源码下,源码可能存在差异
】
话说,当你使用Spring框架进行开发的时候,会不会存在这样的疑问:“为什么加上一个Autowired注解,就可以实现属性注入?它是怎么做到的?如果Spring容器中存在多个相同的bean实例,会怎么样?它是如何判断该属性或方法上是否加上了Autowired注解的?” 相信你时常存在这样的疑问!
sure,我同样存在这些疑问。于是花了一周的时间特地研究了一下Spring的底层源码,当然,一篇文章肯定无法解答你所有的疑惑。这里先进行全流程的分析,也希望你能对照着本篇文章,去看看底层源码【图片看不清的话,点击下载】
是不是看到了这张图之后,就立马想放弃了?别慌!暖心的我会带你慢慢的讲解一遍的。是不是有点小感动呢?可不要爱上我哦!
三、源码分析用了这么久的微服务进行开发,还记得启动类里面的代码吗?
点进去后,会来到SpringApplication中的run方法,run方法中会调用refreshContext方法,刷新上下文容器。没错就是它!【在refreshContext里面会调用refresh方法,进行刷新操作
】
接下来就会来到AbstractApplicationContext中的refresh方法,它很重要!很重要!很重要! 也是本文需要重点关注的方法,里面的细节贼多
由于Spring中的bean默认是非懒加载初始化的,当我们向自定义的bean进行属性或方法注入时,是由finishBeanFactoryInitialization方法帮我们完成的。我们只需要关注这个方法中的beanFactory.preInstantiateSingletons方法,非懒加载的bean实例化工作是由这个方法帮我们完成的
由于我们自定义的bean大多不会实现BeanFactory接口,大多数情况下会进入if代码块中,直接调用getBean方法
由于Spring中默认的就是单例模式,因此,针对上面的代码,我们只需要关注getSingleton方法,在getSingleton方法中,会调用AbstractAutowireCapableBeanFactory的createBean方法
这个方法中applyMergedBeanDefinitionPostProcessors会处理@Autowired、@Value、@PostConstruct、@PreDestroy、@Inject等注解这些注解,可以看到多个实现类,只看处理@Autowired注解的实现类AutowiredAnnotationBeanPostProcessor
当我们获取到对应的元数据信息后,下一步就是需要进行属性注入操作了。在面试的时候,面试官是否问过你,Autowired注解默认根据Type查找依赖的bean,如果找到多个如何处理?
此处省略N步,直接看AutowiredAnnotationBeanPostProcessor的内部类InjectedElement,这个内部类中的beanFactory.resolveDependency就会处理多个依赖的问题
最终会调用DefaultListableBeanFactory的doResolveDependency方法。最后就是采用反射的方式,进行属性注入
在日常开发中,我们常常会使用Autowired注解,却很少去深入源码。相信这篇文章能或多或少的能帮助到你,其实写这篇文章,我花了整整一周的时间看源码,那痛苦,你懂我吧。以上只是简单的梳理一下整个类之间的调用流程,针对里面的一些细节部分,后续会继续深入补充、完善的。
好了,能看到这里的都是大佬啊!如果感觉文章还不错的话,请给我点小小的鼓励, 点赞、收藏+转发 !如果有什么好的意见或建议,也请给我留个言或私信我!谢谢各位看官!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧