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);

浙公网安备 33010602011771号