FactoryBean的getObject调用时机

原文链接:https://blog.csdn.net/u022812849/article/details/114368497?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_ecpm_v1~rank_v31_ecpm-1-114368497-null-null.pc_agg_new_rank&utm_term=FactoryBean%E5%9C%A8%E5%93%AA%E9%87%8C%E6%89%A7%E8%A1%8C%E7%9A%84&spm=1000.2123.3001.4430

先编写测试代码:

public class Dog {

    private String name;

    public Dog(String name) {
        System.out.println("new dog");
        this.name = name;
    }

}
import org.springframework.beans.factory.FactoryBean;

public class DogFactoryBean implements FactoryBean<Dog> {
    @Override
    public Dog getObject() throws Exception {
        return new Dog("WangWang");
    }

    @Override
    public Class<?> getObjectType() {
        return Dog.class;
    }
}
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class FactoryBeanDemo {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        applicationContext.register(DogFactoryBean.class);
        applicationContext.refresh();
        System.out.println(applicationContext.getBean("&dogFactoryBean"));
        System.out.println(applicationContext.getBean("dogFactoryBean"));
    }
}

执行结果

com.jiangzheng.course.dubbo.provider.factorybeantest.DogFactoryBean@2034b64c
new dog
com.jiangzheng.course.dubbo.provider.factorybeantest.Dog@75d3a5e0

从运行结果可以得出以下两个结论:

DogFactoryBean会向Springring器中注入两个对象,一个名为&dogFactoryBean,代表FactoryBean本身,一个名为dogFactoryBean,代表FactoryBean的getObject()方法返回的对象。

DogFactoryBean的getObject()方法只有在使用时才会被调用,也就是只有在使用时才会完成实例化,然后添加到Spring容器中进行管理,有点类似于Bean的懒加载

流程分析:

当执行 applicationContext.getBean(“&dogFactoryBean”)时在这里插入图片描述

我们点下去一直到org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean 方法

在这里插入图片描述

执行org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance 方法
在这里插入图片描述

当执行applicationContext.getBean(“dogFactoryBean”)时
上面流程不变 还是会执行到
执行org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance 方法中
在这里插入图片描述