- 容器基本用法
测试类
XML文件
测试代码
- 源码学习
直接进入getBean方法,定义在BeanFactory接口中,有很多重载,看AbstractBeanFactory中的实现:
调用了doGetBean方法,doGetBean的代码量很大,逻辑也相对复杂:
这段代码存在循环依赖的检测以及多处bean的缓存,首先从singletonObjects中获取,获取不到且当前单例正在创建中则从earlySingletonObjects中获取,如果还是获取不到且allowEarlyReference,则尝试获取ObjectFactory,调用其getObject方法。最后无论是否获取到都返回。回到doGetBean方法,如果获取到单例且传入的args为null,则直接调用getObjectForBeanInstance方法:
这段代码主要是对name不是以&为前缀且beanInstance是FactoryBean的实例进行处理,而这个逻辑主要由FactoryBeanRegistrySupport类的getObjectFromFactoryBean方法处理:
上面的代码主要是一些逻辑的处理,但是没有真正的获取bean,保证了单例的全局唯一性,以及非单例模式的创建。接下来进入doGetObjectFromFactoryBean方法:
//这个代码的逻辑比较简单,首先是判断需不需要权限,不论是否需要权限都会调factoryBean的getObject()方法,最后是对返回值为null的情况做处理,最后返回object。接下来回到getObjectFromFactoryBean方法,可以看到除了逻辑处理之外,对于单例和非单例的创建都调用了postProcessObjectFromFactoryBean方法:
这里的实现是直接返回object,但是在其子类AbstractAutowireCapableBeanFactory有对postProcessObjectFromFactoryBean的重写:
从代码来看就是对结果的处理,后处理器目前并没有接触或者使用,以后了解了再补充。接下来根据return一步一步返回上一层,回到getObjectFromFactoryBean方法,不论是哪种情况,都会在调用了postProcessObjectFromFactoryBean后进行返回。回到getObjectForBeanInstance方法,其实是根据传入的beanName和实例是否是FactoryBean类型的实例对实例进行处理。再回到doGetBean方法,接下来就是对sharedInstance为null或者args不为null两种情况的处理。跳过parentBeanFactory中获取bean的过程,直接看后面的程序,如果不仅仅是做类型检查的话,需要调用markBeanAsCreated方法对缓存进行维护:
首先isDependent以及registerDependentBean方法主要是对循环依赖的维护以及检测。for循环中主要是获取依赖的bean,主要还是调用getBean方法。将所有的依赖bean都创建完成之后才会开始当前bean的创建。首先是单例模式的创建:
直接看prepareMethodOverrides方法,在AbstractBeanDefinition类中实现:
先进入createBeanInstance方法:
autowireConstructor方法代码量非常大,但是总体来说做了两件事,确定构造函数,调用实例化策略的instantiateBean方法创建实例并加入到BeanWrapper中。而instantiateBean同样也是调用了实例化策略的instantiateBean方法:
首先看实例化策略,也就是getInstantiationStrategy方法,在AbstractAutowireCapableBeanFactory类中:
显而意见,如果用户不去设置,则默认的就是CglibSubclassingInstantiationStrategy类的实例,而CglibSubclassingInstantiationStrategy则是SimpleInstantiationStrategy类的子类,instantiate也是在SimpleInstantiationStrategy类中实现的:
反射的具体过程这里就不看了,直接进入CglibSubclassingInstantiationStrategy类重写的instantiateWithMethodInjection方法:
终于完成了实例的创建,可以返回doCreateBean函数了。当bean创建完毕之后,需要进行属性填充以及调用初始化方法,当然也可能没有,初始化方法中也存在一些其他逻辑,最后则是收尾工作,检测依赖以及注册需要销毁的bean,就不再进入代码详细分析了。doCreateBean方法结束后其实一直返回会发现关于bean的创建基本上已经结束了,其他的逻辑比较简单。至此关于bean的创建告一段落。
如果有不正确的地方欢迎指正。
到此这篇swagger2常用注解(@enableswagger2注解)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/62356.html