前面的文章中主要分析Spring是如何加载配置文件以及将其转化成BeanDefinition的,从本文开始,我们继续研究Spring是如何创建bean的。bean加载的功能实现远比bean的解析要复杂得多,会占用多篇文章的篇幅来进行分析,按照流程大致可以分为获取缓存bean、准备创建bean、创建bean这几个部分,本文会在浏览整个bean获取过程的基础上分析一下获取缓存单例的逻辑,更复杂的bean创建的逻辑留待后面文章分析。
1. bean获取过程概览
对于加载bean的功能,在Spring中的调用方式为:
TestBean myTestBean = (TestBean) xmlBeanFactory.getBean("testBean");
这句代码背后是怎样实现的呢?我们可以先快速体验一下Spring中代码是如何实现的,这部分的代码是实现在AbstractBeanFactory中:
1 public Object getBean(String name) throws BeansException {
2 return doGetBean(name, null, null, false);
3 }
4
5 protected <T> T doGetBean(
6 final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
7 throws BeansException {
8 // 获取对应的beanName
9 final String beanName = transformedBeanName(name);
10 Object bean;
11 /* 检查缓存中或者实例工厂中是否有对应的实例
12 * 为什么首先会使用这段代码呢,
13 * 因为在创建单例bean的时候会存在依赖注入的情况,而在创建依赖的时候为了避免循环依赖,
14 * Spring创建bean的原则是不等bean创建完成就会将创建bean的ObjectFact提早曝光
15 * 也就是将objectFactory加入到缓存中,
16 * 一旦下个bean创建时候需要依赖上个bean则直接使用objectFactory
17 **/
18 // Eagerly check singleton cache for manually registered singletons.
19 // 直接尝试从缓存获取或者singletonFactories中的ObjectFactory中获取
20 Object sharedInstance = getSingleton(beanName);
21 if (sharedInstance != null && args == null) {
22 if (logger.isDebugEnabled()) {
23 if (isSingletonCurrentlyInCreation(beanName)) {
24 logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
25 "' that is not fully initialized yet - a consequence of a circular reference");
26 }
27 else {
28 logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
29 }
30 }
31 // 返回对应的实例,有时候存在诸如BeanFactory的情况并不是直接返回实例本身,而是返回指定方法返回的实例
32 bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
33 }
34
35 else {
36 // 只有在单例情况才会尝试解决循环依赖,原型模式情况下,如果存在
37 // A中有B的属性,B中有A的属性,那么当依赖注入的时候,就会产生当A还未创建完的时候由于
38 // 对于B的创建而再次返回创建A,造循环依赖,也就是下面的情况
39 // Fail if we're already creating this bean instance:
40 // We're assumably within a circular reference.
41 if (isPrototypeCurrentlyInCreation(beanName)) {
42 throw new BeanCurrentlyInCreationException(beanName);
43 }
44
45 // Check if bean definition exists in this factory.
46 BeanFactory parentBeanFactory = getParentBeanFactory();
47 // 如果beanDefinitionMap中也就是在所有已经加载的类中不包括beanName则尝试从parentBeanFactory中检测
48 if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
49 // Not found -> check parent.
50 String nameToLookup = originalBeanName(name);
51 // 递归到BeanFactory中寻找
52 if (args != null) {
53 // Delegation to parent with explicit args.
54 return (T) parentBeanFactory.getBean(nameToLookup, args);
55 }
56 else {
57 // No args -> delegate to standard getBean method.
58 return parentBeanFactory.getBean(nameToLookup, requiredType);
59 }
60 }
61 // 如果不是仅仅做类型检查则是创建bean,这里要进行记录
62 if (!typeCheckOnly) {
63 markBeanAsCreated(beanName);
64 }
65
66 try {
67 // 将存储XML配置文件的GernericBeanDefinition转换为RootBeanDefinition,如果指定BeanName是子Bean的话同时会合并父类的相关属性
68 final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
69 checkMergedBeanDefinition(mbd, beanName, args);
70
71 // Guarantee initialization of beans that the current bean depends on.
72 // 确保当前bean依赖的bean已经实例化了,通过递归来实现
73 String[] dependsOn = mbd.getDependsOn();
74 if (dependsOn != null) {
75 for (String dependsOnBean : dependsOn) {
76 getBean(dependsOnBean);
77 // 缓存依赖调用
78 registerDependentBean(dependsOnBean, beanName);
79 }
80 }
81 // 实例化依赖的bean后便可以实例化mbd本身了
82 // singleton模式的创建
83 // Create bean instance.
84 if (mbd.isSingleton()) {
85 sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
86 public Object getObject() throws BeansException {
87 try {
88 return createBean(beanName, mbd, args);
89 }
90
