spring注入bean的三种方式,spring如何注入bean,有哪几种方法?
首先需要知道一个大致实现
该注入过程必须在BeanPostProcessor中实现。
spring实例化beanFactory.getBean中的bean,即懒加载。
根据第二条,也就是说获取bean时会调用所有getBeanpostprocessors。
第二篇文章说BeanFactory的刷新过程只是注册BeanPostProcessor,实际上是在getBean方法中执行的。
(推荐视频:java视频教程)
MerbeandefinitionPostprocessor也是一个BeanPostProcessor。它会重新创建一个生命周期函数,替换BeanPostProcessor的默认生命周期函数。让我们这样来看。我贴一个简短的源代码。
for(BeanPostProcessor BP:getBeanPostProcessors()){
if(mergedbeanditionpostprocessor的bp实例){
mergedbeanditionpostprocessor BDP=(mergedbeanditionpostprocessor)BP;
BDP . postprocessmergedbean definition(mbd,beanType,bean name);
}
}它允许您在非BeanFactoryProcess中修改Bean定义。
InstantiationAware PostProcessor也是一个BeanPostProcessor。它还重新定义了一个生命周期函数,允许将属性值注入到属性对象中。
@Autowired 加载定义的过程
不看bean的创建过程,先看MergedBeandefinitionPostProcessor的实现子类。在这里,我们来看看名字的猜测。
Autowireannotationbeanpost处理器应该是这样做的,所以我们接下来可以直接看它。
autowireannationbeanpostprocessor的postprocessmergedbean definition方法的代码。
通过调用该方法,我们可以知道buildAutowiringMetadata是真正查找这些注释的地方。最后,checkConfigMember将成员注册到bean定义中,查找详细信息的读者可以自行检查源代码。
这里,在bean定义中只注册了成员,它实际上是在填充Bean的过程中被实例化的。当bean被创建时,我们可以知道它何时被注入。
Bean 的创建过程
如前所述,spring在获取bean的过程中创建bean,创建bean分为几个步骤。
1.获取bean定义
2.新Bean()
3.执行生命周期功能(前端)
4.创建依赖关系
5.填充豆
6.执行生命周期功能(之后)
条目是BeanFactory.getBean,BeanFactory的实现类是DefaultListableBeanFactory。你可以在BeanFactory的刷新过程中找到这些。
根据源代码,如果bean尚不存在,将执行bean创建过程。
Get bean是在这个源代码中定义的。
final rootbean definition mbd=getMergedLocalBeanDefinition(bean name);然后,根据bean定义,搜索它的依赖项,并创建Bean。可以看到,bean是递归创建的。
string[]depends on=mbd . getdepends on();
for (String dep : dependsOn) {
get bean(dep);
}然后创建bean。
if (mbd.isSingleton()) {
createBean(beanName,mbd,args);
}
//真正的执行在doCreateBean进程中
object bean instance=docreate bean(bean name,mbdToUse,args);bean创建的第一步,新Bean
if (instanceWrapper==null) {
instance wrapper=createbean instance(bean name,mbd,args);
}创建bean的第二步是执行所有的处理器,包括MergedBeandefinitionPostprocessor,所以在这一步注册注入选项。
applymergedbeanditionpostprocessors(mbd,beanType,bean name);创建bean的第三步,填充bean,这里是@Autowired注入。
populateBean(beanName,mbd,instance wrapper);的最终处理在autowireannationbeanpostprocessor的postProcessPropertyValues函数中进行。
metadata.inject(bean,beanName,PVS);因为之前已经获取了依赖关系,并扔进了容器,所以这里直接用反射写就可以了。
创建bean的第四步是初始化bean。这里有一个方法注入,最初发生在bean初始化的过程中,执行生命周期函数,包括BeanPostProcessor的前后生命周期,初始化方法等。
注意:autowiredannotationbeanpostprocessor既是mergedbeandefinitionpostprocessor,也是instantiawarebeanpostprocessor
本文来自我们,java教程专栏,欢迎学习!以上是spring如何注入对象的细节和bean创建过程的分析。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。