spring bean的创建过程

先定义一个bean,并在构造方法下个断点调试

@Component
public class xyz {
    public xyz() {
        System.out.println("bean初始化");
    }
}

 

从底往外跟踪,个人认为几个重要的过程如下

 

 

 在 Bean工厂的 preInstantiateSingletons 方法中,可以看到很多熟悉的东西:判断是否抽象方法,是否单例,是否懒加载等,经过这些流程后,又了调用了getBean方法。而Bean的信息又与RootBeanDefinitio类息息相关


List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);for (String beanName : beanNames) {            
          RootBeanDefinition bd
= getMergedLocalBeanDefinition(beanName);
          if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {

if (isFactoryBean(beanName)) {
                    Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
                    if (bean instanceof FactoryBean) {
              ..........
} } else { getBean(beanName); }

BeanDefinitio类可以理解为对spring bean的描述,相当于java中Class对象对一个类的描述。这个类,能看到很多Bean的信息,而它是放在Spring容器的Bean工厂当中

 

 通过invokeBeanFactoryPostProcessors方法,对BeanDefinitio类进行了初始化,可以发现,执行这个方法后,xyz的bean信息出现在map当中。

 

 

通过这个信息,spring就知道了如何创建一个bean,构建对象最终过程很朴素,就是通过一个反射,真正复杂的是spring在对象创建前和创建后做的事,这个留在以后研究,先浅摸一下spring源码

 

 

return ctor.newInstance(argsWithDefaultValues);

 

posted @ 2023-03-26 18:42  落雪QAQ  阅读(92)  评论(0)    收藏  举报