FactoryBean的getObject调用时机
先编写测试代码:
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 方法中