FactoryBean创建流程
1.判断当前bean是否是FactoryBean,如果是进入FactoryBean的创建流程,不是走普通的Bean创建流程
2.给BeanName加上&修饰前缀开始getBean
3.在doGetBean时,移除&前缀,去容器缓存中获取,第一次创建基本不没有,没有就将该Bean添加到已经创建的缓存中,要走开始创建流程
4.FactoryBean到了创建时(CreateBean)和普通Bean创建流程就一样了
5.FactroyBean实例化成功后走getObjectForBeanInstance(),判断bean的name是不是以&开头,设置该bean的MegerBeanDefintion的isFactoryBean属性为true,最后返回创建成功的FactoryBean对象
通过&beanName获取FactoryBean本身
MyFactoryBean bean1 = (MyFactoryBean) ac.getBean( “&myFactoryBean”);这个参数为name,后面会截取掉&前缀变量名为beanName
1.移除name变量的&前缀,用一个beanName变量接收,然后从容器的缓存中取(FactoryBean本身),取到后走getObjectForBeanInstance,该方法需要将从容器中拿到的FactoryBean本身、原始参数name和beanName都要传过去
2.判断name是不是以&为前缀,这里肯定是,因为我们本来就是要获取FactoryBean本身,而不是FactoryBean创建的对象,如果获取本身就会将之前从容器缓存中取出的对象直接返回。
通过beanName获取FactoryBean创建的对象
1.移除name变量的&前缀,用一个beanName变量接收(这次没有&前缀,name和beanName是一样的)然后从容器的缓存中取(FactoryBean本身),取到后走getObjectForBeanInstance,该方法需要将从容器中拿到的FactoryBean本身、原始参数name和beanName都要传过去
2.判断name是不是以&为前缀,不是的话,创建一个Object对象,用来接收FactoryBean创建出来的Bean对象
3.从工厂的factoryBeanObjectCached(FactoryBean创建Bean的缓存)缓存中取,有的话直接返回(第一次获取肯定没有),没有通过FactoryBean#getObject方法进行创建流程。
4.判断该FactoryBean#isSingleton是单例还是原型对象。然后通过FactoryBean#getObject创建一个Bean出来,如果是单例对象,放入factoryBeanObjectCached缓存中,如果是原型,不存缓存中。最后直接返回