核心创建方式

Class<?> ob = Class.forName("com.fxl.spring.test.SayServiceImpl");
    //ob.getDeclaredConstructor(); 检测构造器是否是公有
    SayService say = (SayService) ob.newInstance();
    say.getMessage();

结构图

spring源码核心:DefaultListableBeanFactory_缓存

 

 

 

接口:
  • AliasRegistry:注册别名和具体的名称接口
  • SingletonBeanRegistry:注册bean的接口
  • BeanFactory:bean的实际调用接口
  • HierarchicalBeanFactory:beanfactory的强化接口
  • ConfigurableBeanFactory:beanfactory的调用接口
  • AutowireCapableBeanFactory:beanfactory的强化接口
  • ListableBeanFactory:beanfactory的强化接口,批量处理bean
  • BeanDefinitionRegistry:bean的调用接口,包括接口别名
  • ConfigurableListableBeanFactory:除了可配置beanfactory之外,它还提供了用于分析和修改bean定义的工具,以及预实例化单例
实现类
  • SimpleAliasRegistry:存放别名和实际
public class SimpleAliasRegistry implements AliasRegistry {

    /** Map from alias to canonical name */
    private final Map<String, String> aliasMap = new ConcurrentHashMap<String, String>(16);
}

DefaultSingletonBeanRegistry:存放具体的bean

  • singletonObjects: 存放bean的名称及实例
  • singletonFactories: 存放bean的名称及实例创建工厂

  • public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
    
        /**
         * Internal marker for a null singleton object:
         * used as marker value for concurrent Maps (which don't support null values).
         */
        protected static final Object NULL_OBJECT = new Object();
    
    
        /** Logger available to subclasses */
        protected final Log logger = LogFactory.getLog(getClass());
    
        /** Cache of singleton objects: bean name --> bean instance */
        // bean的名称和实例
        private final Map<String, Object> 'singletonObjects' = new ConcurrentHashMap<String, Object>(64);
    
        /** Cache of singleton factories: bean name --> ObjectFactory */
        // bean名称和产生的工厂
        private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);
    
        /** Cache of early singleton objects: bean name --> bean instance */
        // 早期存放bean的名称和实例
        private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
    
        /** Set of registered singletons, containing the bean names in registration order */
        // bean的名称
        private final Set<String> registeredSingletons = new LinkedHashSet<String>(64);
    
        /** Names of beans that are currently in creation */
        // 创建的类
        private final Set<String> singletonsCurrentlyInCreation =
                Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(16));
    
        /** Names of beans currently excluded from in creation checks */
        // 当前创建时需要排除的名称
        private final Set<String> inCreationCheckExclusions =
                Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(16));
    
        /** List of suppressed Exceptions, available for associating related causes */
        // 抛出的错误
        private Set<Exception> suppressedExceptions;
    
        /** Flag that indicates whether we're currently within destroySingletons */
        // 销毁时的状态
        private boolean singletonsCurrentlyInDestruction = false;
    
        /** Disposable bean instances: bean name --> disposable instance */
        // bean名称
        private final Map<String, Object> disposableBeans = new LinkedHashMap<String, Object>();
    
        /** Map between containing bean names: bean name --> Set of bean names that the bean contains */
        // 名称
        private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>(16);
    
        /** Map between dependent bean names: bean name --> Set of dependent bean names */
        // 依赖的名称
        private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>(64);
    
        /** Map between depending bean names: bean name --> Set of bean names for the bean's dependencies */
        // 依赖的名称
        private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>(64);
    }


    • FactoryBeanRegistrySupport:bean缓存

    • public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry {
      
          /** Cache of singleton objects created by FactoryBeans: FactoryBean name --> object */
          // 由FactoryBean创建的单例对象的缓存:FactoryBean名称—对象
          private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<String, Object>(16);
      }


      • AbstractBeanFactory:

      • public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
        
            /** Parent bean factory, for bean inheritance support */
            // 父类 bean factory
            private BeanFactory parentBeanFactory;
        
            /** ClassLoader to resolve bean class names with, if necessary */
            // 类加载器
            private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();
        
            /** ClassLoader to temporarily resolve bean class names with, if necessary */
            // 类加载器在必要时临时解析bean类名
            private ClassLoader tempClassLoader;
        
            /** Whether to cache bean metadata or rather reobtain it for every access */
            // 是否缓存bean元数据,或者是否为每个访问重新获取它
            private boolean cacheBeanMetadata = true;
        
            /** Resolution strategy for expressions in bean definition values */
            //  bean定义值的表达式的解析策略
            private BeanExpressionResolver beanExpressionResolver;
        
            /** Spring ConversionService to use instead of PropertyEditors */
            // 使用Spring ConversionService来代替属性编辑器
            private ConversionService conversionService;
        
            /** Custom PropertyEditorRegistrars to apply to the beans of this factory */
            // 自定义propertyeditorregistry应用到该工厂的bean
            private final Set<PropertyEditorRegistrar> propertyEditorRegistrars =
                    new LinkedHashSet<PropertyEditorRegistrar>(4);
        
            /** A custom TypeConverter to use, overriding the default PropertyEditor mechanism */
            // 用于使用的自定义类型转换,覆盖默认的PropertyEditor机制
            private TypeConverter typeConverter;
        
            /** Custom PropertyEditors to apply to the beans of this factory */
            // 自定义属性编辑器应用到该工厂的bean
            private final Map<Class<?>, Class<? extends PropertyEditor>> customEditors =
                    new HashMap<Class<?>, Class<? extends PropertyEditor>>(4);
        
            /** String resolvers to apply e.g. to annotation attribute values */
            // 将字符串解析器应用于注释属性值
            private final List<StringValueResolver> embeddedValueResolvers = new LinkedList<StringValueResolver>();
        
            /** BeanPostProcessors to apply in createBean */
            // 用于在createBean中应用的beanpost处理器
            private final List<BeanPostProcessor> beanPostProcessors = new ArrayList<BeanPostProcessor>();
        
            /** Indicates whether any InstantiationAwareBeanPostProcessors have been registered */
            // 表明InstantiationAwareBeanPostProcessors是否已经注册
            private boolean hasInstantiationAwareBeanPostProcessors;
        
            /** Indicates whether any DestructionAwareBeanPostProcessors have been registered */
            // 表明DestructionAwareBeanPostProcessors是否已经注册
            private boolean hasDestructionAwareBeanPostProcessors;
        
            /** Map from scope identifier String to corresponding Scope */
            // 从范围标识符字符串映射到对应的范围
            private final Map<String, Scope> scopes = new HashMap<String, Scope>(8);
        
            /** Security context used when running with a SecurityManager */
            // 与安全管理器一起运行时使用的安全上下文
            private SecurityContextProvider securityContextProvider;
        
            /** Map from bean name to merged RootBeanDefinition */
            // 从bean名称映射到合并的RootBeanDefinition
            private final Map<String, RootBeanDefinition> mergedBeanDefinitions =
                    new ConcurrentHashMap<String, RootBeanDefinition>(64);
        
            /** Names of beans that have already been created at least once */
            // 已经至少创建过一次的bean的名称
            private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(64));
        
            /** Names of beans that are currently in creation */
            // 当前正在创建的bean的名称
            private final ThreadLocal<Object> prototypesCurrentlyInCreation =
                    new NamedThreadLocal<Object>("Prototype beans currently in creation");
        }


        AbstractAutowireCapableBeanFactory:抽象bean工厂超类,实现了默认bean的创建,具有由RootBeanDefinition类指定的全部功能

        • 提供bean创建(使用构造函数解析)、属性填充、连接(包括自动连接)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动装配构造函数、属性名和属性

        • public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
                  implements AutowireCapableBeanFactory {
          
              /** Strategy for creating bean instances */
              // 创建bean实例的策略
              private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
          
              /** Resolver strategy for method parameter names */
              // 方法参数名的解析器策略
              private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
          
              /** Whether to automatically try to resolve circular references between beans */
              // 是否自动尝试解析bean之间的循环引用
              private boolean allowCircularReferences = true;
          
              /**
               * Whether to resort to injecting a raw bean instance in case of circular reference, even if the injected bean eventually got wrapped.
               */
              // 是否在循环引用的情况下使用原始bean实例,即使注入的bean最终被包装了
              private boolean allowRawInjectionDespiteWrapping = false;
          
              /**
               * Dependency types to ignore on dependency check and autowire, as Set of Class objects: for example, String. Default is none.
               */
               // 依赖类型忽略依赖检查和自动连接,这是类对象的集合:例如,String。默认是没有的。
              private final Set<Class<?>> ignoredDependencyTypes = new HashSet<Class<?>>();
          
              /**
               * Dependency interfaces to ignore on dependency check and autowire, as Set of  Class objects. By default, only the BeanFactory interface is ignored.
               */
               // 依赖接口忽略依赖检查和自动连接,这是类对象的集合。默认情况下,只会忽略BeanFactory接口。
              private final Set<Class<?>> ignoredDependencyInterfaces = new HashSet<Class<?>>();
          
              /** Cache of unfinished FactoryBean instances: FactoryBean name --> BeanWrapper */
              // 未完成的FactoryBean实例的缓存:FactoryBean的名称—bean包装器
              private final Map<String, BeanWrapper> factoryBeanInstanceCache =
                      new ConcurrentHashMap<String, BeanWrapper>(16);
          
              /** Cache of filtered PropertyDescriptors: bean Class -> PropertyDescriptor array */
              // 过滤的属性描述符的缓存:bean类-属性描述符数组
              private final Map<Class<?>, PropertyDescriptor[]> filteredPropertyDescriptorsCache =
                      new ConcurrentHashMap<Class<?>, PropertyDescriptor[]>(64);
          }


          • DefaultListableBeanFactory:在访问bean之前,典型的用法是先注册所有的bean定义(可能是从bean定义文件中读取)。因此,Bean定义查找在本地Bean定义表中是一种廉价的操作,在预先构建的Bean定义元数据对象上运行。

          • public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
                    implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
            
                private static Class<?> javaxInjectProviderClass = null;
            
                /** Map from serialized id to factory instance */
                // 序列化的工程id
                private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories =
                        new ConcurrentHashMap<String, Reference<DefaultListableBeanFactory>>(8);
            
                /** Optional id for this factory, for serialization purposes */
                //这个工厂的可选id,用于序列化
                private String serializationId;
            
                /** Whether to allow re-registration of a different definition with the same name */
                // 是否允许用相同的名称重新注册一个不同的定义
                private boolean allowBeanDefinitionOverriding = true;
            
                /** Whether to allow eager class loading even for lazy-init beans */
                // 是否允许热加载即使是 懒加载设置
                private boolean allowEagerClassLoading = true;
            
                /** Optional OrderComparator for dependency Lists and arrays */
                // 用于依赖列表和数组的可选的OrderComparator
                private Comparator<Object> dependencyComparator;
            
                /** Resolver to use for checking if a bean definition is an autowire candidate */
                // 解析器用于检查bean定义是否为自动连接的候选
                private AutowireCandidateResolver autowireCandidateResolver = new SimpleAutowireCandidateResolver();
            
                /** Map from dependency type to corresponding autowired value */
                // 从依赖类型映射到对应的自动连接值
                private final Map<Class<?>, Object> resolvableDependencies = new HashMap<Class<?>, Object>(16);
            
                /** Map of bean definition objects, keyed by bean name */
                // bean定义对象的映射,以bean名称为键
                private final Map<String, BeanDefinition> 'beanDefinitionMap' = new ConcurrentHashMap<String, BeanDefinition>(64);
            
                /** Map of singleton and non-singleton bean names keyed by dependency type */
                // 单例和非单例bean的映射,依赖于依赖类型
                private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<Class<?>, String[]>(64);
            
                /** Map of singleton-only bean names keyed by dependency type */
                // 依赖类型的名称
                private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<Class<?>, String[]>(64);
            
                /** List of bean definition names, in registration order */
                // 默认的名称列表
                private final List<String> beanDefinitionNames = new ArrayList<String>();
            
                /** Whether bean definition metadata may be cached for all beans */
                // 是否为所有bean缓存bean定义元数据
                private boolean configurationFrozen = false;
            
                /** Cached array of bean definition names in case of frozen configuration */
                // 在冻结配置的情况下,缓存的bean定义名称
                private String[] frozenBeanDefinitionNames;
            }


            beanfactory:bean的创建工厂
            • 流程:
              • 从AbstractApplicationContext->refresh()->finishBeanFactoryInitialization():实例化bean的时候,会调用beanFactory.preInstantiateSingletons()
              • 接着在 DefaultListableBeanFactory->preInstantiateSingletons()
              • 接着在AbstractBeanFactory->doGetBean()中使用getSingleton()回调一个beanfactory
              • 最后调用 SimpleInstantiationStrategy->instantiate()的来实例化bean

              • 1. DefaultListableBeanFactory->preInstantiateSingletons():
                public void preInstantiateSingletons() throws BeansException {
                
                    List<String> beanNames;
                    synchronized (this.beanDefinitionMap) {
                        beanNames = new ArrayList<String>(this.beanDefinitionNames);
                    }
                    for (String beanName : beanNames) {
                        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
                        if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
                                getBean(beanName);
                        }
                    }
                }
                2. AbstractBeanFactory->getBean(String beanName);
                public Object getBean(String name) throws BeansException {
                    return doGetBean(name, null, null, false);
                }
                3.AbstractBeanFactory->doGetBean(String beanName);一个回调用来生成 bean
                protected <T> T doGetBean(
                        final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
                        throws BeansException {
                    final String beanName = transformedBeanName(name);
                    Object bean;
                    ...
                    ...
                    'getSingleton回调一个ObjectFactory'
                    sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
                        @Override
                        public Object getObject() throws BeansException {
                            try {
                                return createBean(beanName, mbd, args);
                            }catch (BeansException ex) {
                                destroySingleton(beanName);
                            }
                        }
                    });
                    ...
                    ...
                    bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                    return (T) bean;
                }
                4. DefaultSingletonBeanRegistry.class->getSingleton:调用singletonFactory的回调来实现bean的创建
                public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
                    synchronized (this.singletonObjects) {
                        Object singletonObject = this.singletonObjects.get(beanName);
                        if (singletonObject  null) {
                            ...
                            ...
                            try {
                                singletonObject = singletonFactory.getObject();
                            }
                            ...
                            ...
                        return (singletonObject != NULL_OBJECT ? singletonObject : null);
                    }
                }
                5. SimpleInstantiationStrategy->instantiate()


                BeanDefinition: spring的bean默认映射对象
                • 创建流程:
                  • 从AbstractApplicationContext->refresh():刷新context的信息。
                  • obtainFreshBeanFactory():创建beanfactory,并将xml里面的bean解析成BeanDefinition,存放到beanDefinitionMap中。
                    • 先从XmlReaderContext中读取配置,然后在根据配置BeanDefinitionDocumentReader
                • 分析bean

                • private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
                      if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
                          importBeanDefinitionResource(ele);
                      }
                      else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
                          processAliasRegistration(ele);
                      }
                      else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
                          processBeanDefinition(ele, delegate);   //加载bean
                      }
                      else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
                          // recurse
                          doRegisterBeanDefinitions(ele);
                      }
                  }


                  BeanDefinitionReaderUtils工具类中的createBeanDefin


                • public static AbstractBeanDefinition createBeanDefinition(
                              String parentName, String className, ClassLoader classLoader) throws ClassNotFoundException {
                  
                          GenericBeanDefinition bd = new GenericBeanDefinition();
                          bd.setParentName(parentName);
                          if (className != null) {
                              if (classLoader != null) {
                                  bd.setBeanClass(ClassUtils.forName(className, classLoader));
                              }
                              else {
                                  bd.setBeanClassName(className);
                              }
                          }
                          return bd;
                      }


                  • BeanDefinition的创建组成:

                  • 1. '属性'
                    public abstract class AttributeAccessorSupport implements AttributeAccessor, Serializable {
                    
                        /** Map with String keys and Object values */
                        private final Map<String, Object> attributes = new LinkedHashMap<String, Object>(0);
                    }
                    2. '资源'
                    public class BeanMetadataAttributeAccessor extends AttributeAccessorSupport implements BeanMetadataElement {
                    
                        private Object source;
                    }
                    
                    3. '对象信息'
                    public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
                            implements BeanDefinition, Cloneable {
                    
                        public static final String SCOPE_DEFAULT = "";
                        public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO;
                        public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
                        public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
                        public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;
                    
                        public static final int AUTOWIRE_AUTODETECT = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT;
                    
                        public static final int DEPENDENCY_CHECK_NONE = 0;
                        public static final int DEPENDENCY_CHECK_OBJECTS = 1;
                        public static final int DEPENDENCY_CHECK_SIMPLE = 2;
                        public static final int DEPENDENCY_CHECK_ALL = 3;
                    
                        public static final String INFER_METHOD = "(inferred)";
                    
                    
                        private volatile Object beanClass;
                    
                        private String scope = SCOPE_DEFAULT;
                    
                        private boolean abstractFlag = false;
                    
                        private boolean lazyInit = false;
                    
                        private int autowireMode = AUTOWIRE_NO;
                    
                        private int dependencyCheck = DEPENDENCY_CHECK_NONE;
                    
                        private String[] dependsOn;
                    
                        private boolean autowireCandidate = true;
                    
                        private boolean primary = false;
                    
                        private final Map<String, AutowireCandidateQualifier> qualifiers =
                                new LinkedHashMap<String, AutowireCandidateQualifier>(0);
                    
                        private boolean nonPublicAccessAllowed = true;
                    
                        private boolean lenientConstructorResolution = true;
                    
                        private ConstructorArgumentValues constructorArgumentValues;
                    
                        private MutablePropertyValues propertyValues;
                    
                        private MethodOverrides methodOverrides = new MethodOverrides();
                    
                        private String factoryBeanName;
                    
                        private String factoryMethodName;
                    
                        private String initMethodName;
                    
                        private String destroyMethodName;
                    
                        private boolean enforceInitMethod = true;
                    
                        private boolean enforceDestroyMethod = true;
                    
                        private boolean synthetic = false;
                    
                        private int role = BeanDefinition.ROLE_APPLICATION;
                    
                        private String description;
                    
                        private Resource resource;
                    }
                    4. 创建:bean创建的信息
                    public class GenericBeanDefinition extends AbstractBeanDefinition {
                    
                        private String parentName;
                    }


                    BeanDefinition的使用

                    • 通过SimpleInstantiationStrategy的instantiate,来创建bean对象。

                    • public Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) {
                          if (beanDefinition.getMethodOverrides().isEmpty()) {
                              Constructor<?> constructorToUse;
                              synchronized (beanDefinition.constructorArgumentLock) {
                                  constructorToUse = (Constructor<?>) beanDefinition.resolvedConstructorOrFactoryMethod;
                                  if (constructorToUse  null) {
                                      final Class<?> clazz = beanDefinition.getBeanClass();
                                      if (clazz.isInterface()) {
                                          throw new BeanInstantiationException(clazz, "Specified class is an interface");
                                      }
                                      try {
                                          if (System.getSecurityManager() != null) {
                                              constructorToUse = AccessController.doPrivileged(new PrivilegedExceptionAction<Constructor<?>>() {
                                                  @Override
                                                  public Constructor<?> run() throws Exception {
                                                      return clazz.getDeclaredConstructor((Class[]) null);
                                                  }
                                              });
                                          }
                                          else {
                                          '获取构造器'
                                              constructorToUse =    clazz.getDeclaredConstructor((Class[]) null);
                                          }
                                          beanDefinition.resolvedConstructorOrFactoryMethod = constructorToUse;
                                      }
                                      catch (Exception ex) {
                                          throw new BeanInstantiationException(clazz, "No default constructor found", ex);
                                      }
                                  }
                              }
                              '实例化对象'
                              return BeanUtils.instantiateClass(constructorToUse);
                          }
                          else {
                              // Must generate CGLIB subclass.
                              return instantiateWithMethodInjection(beanDefinition, beanName, owner);
                          }
                      }
                      
                      2. 'BeanUtils.instantiateClass(constructorToUse)':用构造器实例化
                      public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws BeanInstantiationException {
                          Assert.notNull(ctor, "Constructor must not be null");
                          try {
                              ReflectionUtils.makeAccessible(ctor);
                              return ctor.newInstance(args);
                          }
                          ....
                      }


核心创建方式

Class<?> ob = Class.forName("com.fxl.spring.test.SayServiceImpl");
    //ob.getDeclaredConstructor(); 检测构造器是否是公有
    SayService say = (SayService) ob.newInstance();
    say.getMessage();

结构图

spring源码核心:DefaultListableBeanFactory_ci_02

接口:
  • AliasRegistry:注册别名和具体的名称接口
  • SingletonBeanRegistry:注册bean的接口
  • BeanFactory:bean的实际调用接口
  • HierarchicalBeanFactory:beanfactory的强化接口
  • ConfigurableBeanFactory:beanfactory的调用接口
  • AutowireCapableBeanFactory:beanfactory的强化接口
  • ListableBeanFactory:beanfactory的强化接口,批量处理bean
  • BeanDefinitionRegistry:bean的调用接口,包括接口别名
  • ConfigurableListableBeanFactory:除了可配置beanfactory之外,它还提供了用于分析和修改bean定义的工具,以及预实例化单例
实现类
  • SimpleAliasRegistry:存放别名和实际
public class SimpleAliasRegistry implements AliasRegistry {

	/** Map from alias to canonical name */
	private final Map<String, String> aliasMap = new ConcurrentHashMap<String, String>(16);
}
  • DefaultSingletonBeanRegistry:存放具体的bean
  • singletonObjects: 存放bean的名称及实例
  • singletonFactories: 存放bean的名称及实例创建工厂
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {

	/**
	 * Internal marker for a null singleton object:
	 * used as marker value for concurrent Maps (which don't support null values).
	 */
	protected static final Object NULL_OBJECT = new Object();


	/** Logger available to subclasses */
	protected final Log logger = LogFactory.getLog(getClass());

	/** Cache of singleton objects: bean name --> bean instance */
	// bean的名称和实例
	private final Map<String, Object> 'singletonObjects' = new ConcurrentHashMap<String, Object>(64);

	/** Cache of singleton factories: bean name --> ObjectFactory */
	// bean名称和产生的工厂
	private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);

	/** Cache of early singleton objects: bean name --> bean instance */
	// 早期存放bean的名称和实例
	private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);

	/** Set of registered singletons, containing the bean names in registration order */
	// bean的名称
	private final Set<String> registeredSingletons = new LinkedHashSet<String>(64);

	/** Names of beans that are currently in creation */
	// 创建的类
	private final Set<String> singletonsCurrentlyInCreation =
			Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(16));

	/** Names of beans currently excluded from in creation checks */
	// 当前创建时需要排除的名称
	private final Set<String> inCreationCheckExclusions =
			Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(16));

	/** List of suppressed Exceptions, available for associating related causes */
	// 抛出的错误
	private Set<Exception> suppressedExceptions;

	/** Flag that indicates whether we're currently within destroySingletons */
	// 销毁时的状态
	private boolean singletonsCurrentlyInDestruction = false;

	/** Disposable bean instances: bean name --> disposable instance */
	// bean名称
	private final Map<String, Object> disposableBeans = new LinkedHashMap<String, Object>();

	/** Map between containing bean names: bean name --> Set of bean names that the bean contains */
	// 名称
	private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>(16);

	/** Map between dependent bean names: bean name --> Set of dependent bean names */
	// 依赖的名称
	private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>(64);

	/** Map between depending bean names: bean name --> Set of bean names for the bean's dependencies */
	// 依赖的名称
	private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>(64);
}
  • FactoryBeanRegistrySupport:bean缓存
public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry {

	/** Cache of singleton objects created by FactoryBeans: FactoryBean name --> object */
	// 由FactoryBean创建的单例对象的缓存:FactoryBean名称—对象
	private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<String, Object>(16);
}
  • AbstractBeanFactory:
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {

	/** Parent bean factory, for bean inheritance support */
	// 父类 bean factory
	private BeanFactory parentBeanFactory;

	/** ClassLoader to resolve bean class names with, if necessary */
	// 类加载器
	private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();

	/** ClassLoader to temporarily resolve bean class names with, if necessary */
	// 类加载器在必要时临时解析bean类名
	private ClassLoader tempClassLoader;

	/** Whether to cache bean metadata or rather reobtain it for every access */
	// 是否缓存bean元数据,或者是否为每个访问重新获取它
	private boolean cacheBeanMetadata = true;

	/** Resolution strategy for expressions in bean definition values */
	//  bean定义值的表达式的解析策略
	private BeanExpressionResolver beanExpressionResolver;

	/** Spring ConversionService to use instead of PropertyEditors */
	// 使用Spring ConversionService来代替属性编辑器
	private ConversionService conversionService;

	/** Custom PropertyEditorRegistrars to apply to the beans of this factory */
	// 自定义propertyeditorregistry应用到该工厂的bean
	private final Set<PropertyEditorRegistrar> propertyEditorRegistrars =
			new LinkedHashSet<PropertyEditorRegistrar>(4);

	/** A custom TypeConverter to use, overriding the default PropertyEditor mechanism */
	// 用于使用的自定义类型转换,覆盖默认的PropertyEditor机制
	private TypeConverter typeConverter;

	/** Custom PropertyEditors to apply to the beans of this factory */
	// 自定义属性编辑器应用到该工厂的bean
	private final Map<Class<?>, Class<? extends PropertyEditor>> customEditors =
			new HashMap<Class<?>, Class<? extends PropertyEditor>>(4);

	/** String resolvers to apply e.g. to annotation attribute values */
	// 将字符串解析器应用于注释属性值
	private final List<StringValueResolver> embeddedValueResolvers = new LinkedList<StringValueResolver>();

	/** BeanPostProcessors to apply in createBean */
	// 用于在createBean中应用的beanpost处理器
	private final List<BeanPostProcessor> beanPostProcessors = new ArrayList<BeanPostProcessor>();

	/** Indicates whether any InstantiationAwareBeanPostProcessors have been registered */
	// 表明InstantiationAwareBeanPostProcessors是否已经注册
	private boolean hasInstantiationAwareBeanPostProcessors;

	/** Indicates whether any DestructionAwareBeanPostProcessors have been registered */
	// 表明DestructionAwareBeanPostProcessors是否已经注册
	private boolean hasDestructionAwareBeanPostProcessors;

	/** Map from scope identifier String to corresponding Scope */
	// 从范围标识符字符串映射到对应的范围
	private final Map<String, Scope> scopes = new HashMap<String, Scope>(8);

	/** Security context used when running with a SecurityManager */
	// 与安全管理器一起运行时使用的安全上下文
	private SecurityContextProvider securityContextProvider;

	/** Map from bean name to merged RootBeanDefinition */
	// 从bean名称映射到合并的RootBeanDefinition
	private final Map<String, RootBeanDefinition> mergedBeanDefinitions =
			new ConcurrentHashMap<String, RootBeanDefinition>(64);

	/** Names of beans that have already been created at least once */
	// 已经至少创建过一次的bean的名称
	private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(64));

	/** Names of beans that are currently in creation */
	// 当前正在创建的bean的名称
	private final ThreadLocal<Object> prototypesCurrentlyInCreation =
			new NamedThreadLocal<Object>("Prototype beans currently in creation");
}
  • AbstractAutowireCapableBeanFactory:抽象bean工厂超类,实现了默认bean的创建,具有由RootBeanDefinition类指定的全部功能
  • 提供bean创建(使用构造函数解析)、属性填充、连接(包括自动连接)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动装配构造函数、属性名和属性
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
		implements AutowireCapableBeanFactory {

	/** Strategy for creating bean instances */
	// 创建bean实例的策略
	private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();

	/** Resolver strategy for method parameter names */
	// 方法参数名的解析器策略
	private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();

	/** Whether to automatically try to resolve circular references between beans */
	// 是否自动尝试解析bean之间的循环引用
	private boolean allowCircularReferences = true;

	/**
	 * Whether to resort to injecting a raw bean instance in case of circular reference, even if the injected bean eventually got wrapped.
	 */
	// 是否在循环引用的情况下使用原始bean实例,即使注入的bean最终被包装了
	private boolean allowRawInjectionDespiteWrapping = false;

	/**
	 * Dependency types to ignore on dependency check and autowire, as Set of Class objects: for example, String. Default is none.
	 */
	 // 依赖类型忽略依赖检查和自动连接,这是类对象的集合:例如,String。默认是没有的。
	private final Set<Class<?>> ignoredDependencyTypes = new HashSet<Class<?>>();

	/**
	 * Dependency interfaces to ignore on dependency check and autowire, as Set of  Class objects. By default, only the BeanFactory interface is ignored.
	 */
	 // 依赖接口忽略依赖检查和自动连接,这是类对象的集合。默认情况下,只会忽略BeanFactory接口。
	private final Set<Class<?>> ignoredDependencyInterfaces = new HashSet<Class<?>>();

	/** Cache of unfinished FactoryBean instances: FactoryBean name --> BeanWrapper */
	// 未完成的FactoryBean实例的缓存:FactoryBean的名称—bean包装器
	private final Map<String, BeanWrapper> factoryBeanInstanceCache =
			new ConcurrentHashMap<String, BeanWrapper>(16);

	/** Cache of filtered PropertyDescriptors: bean Class -> PropertyDescriptor array */
	// 过滤的属性描述符的缓存:bean类-属性描述符数组
	private final Map<Class<?>, PropertyDescriptor[]> filteredPropertyDescriptorsCache =
			new ConcurrentHashMap<Class<?>, PropertyDescriptor[]>(64);
}
  • DefaultListableBeanFactory:在访问bean之前,典型的用法是先注册所有的bean定义(可能是从bean定义文件中读取)。因此,Bean定义查找在本地Bean定义表中是一种廉价的操作,在预先构建的Bean定义元数据对象上运行。
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
		implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {

	private static Class<?> javaxInjectProviderClass = null;

	/** Map from serialized id to factory instance */
	// 序列化的工程id
	private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories =
			new ConcurrentHashMap<String, Reference<DefaultListableBeanFactory>>(8);

	/** Optional id for this factory, for serialization purposes */
	//这个工厂的可选id,用于序列化
	private String serializationId;

	/** Whether to allow re-registration of a different definition with the same name */
	// 是否允许用相同的名称重新注册一个不同的定义
	private boolean allowBeanDefinitionOverriding = true;

	/** Whether to allow eager class loading even for lazy-init beans */
	// 是否允许热加载即使是 懒加载设置
	private boolean allowEagerClassLoading = true;

	/** Optional OrderComparator for dependency Lists and arrays */
	// 用于依赖列表和数组的可选的OrderComparator
	private Comparator<Object> dependencyComparator;

	/** Resolver to use for checking if a bean definition is an autowire candidate */
	// 解析器用于检查bean定义是否为自动连接的候选
	private AutowireCandidateResolver autowireCandidateResolver = new SimpleAutowireCandidateResolver();

	/** Map from dependency type to corresponding autowired value */
	// 从依赖类型映射到对应的自动连接值
	private final Map<Class<?>, Object> resolvableDependencies = new HashMap<Class<?>, Object>(16);

	/** Map of bean definition objects, keyed by bean name */
	// bean定义对象的映射,以bean名称为键
	private final Map<String, BeanDefinition> 'beanDefinitionMap' = new ConcurrentHashMap<String, BeanDefinition>(64);

	/** Map of singleton and non-singleton bean names keyed by dependency type */
	// 单例和非单例bean的映射,依赖于依赖类型
	private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<Class<?>, String[]>(64);

	/** Map of singleton-only bean names keyed by dependency type */
	// 依赖类型的名称
	private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<Class<?>, String[]>(64);

	/** List of bean definition names, in registration order */
	// 默认的名称列表
	private final List<String> beanDefinitionNames = new ArrayList<String>();

	/** Whether bean definition metadata may be cached for all beans */
	// 是否为所有bean缓存bean定义元数据
	private boolean configurationFrozen = false;

	/** Cached array of bean definition names in case of frozen configuration */
	// 在冻结配置的情况下,缓存的bean定义名称
	private String[] frozenBeanDefinitionNames;
}
beanfactory:bean的创建工厂
  • 流程:
  • 从AbstractApplicationContext->refresh()->finishBeanFactoryInitialization():实例化bean的时候,会调用beanFactory.preInstantiateSingletons()
  • 接着在 DefaultListableBeanFactory->preInstantiateSingletons()
  • 接着在AbstractBeanFactory->doGetBean()中使用getSingleton()回调一个beanfactory
  • 最后调用 SimpleInstantiationStrategy->instantiate()的来实例化bean
1. DefaultListableBeanFactory->preInstantiateSingletons():
public void preInstantiateSingletons() throws BeansException {

	List<String> beanNames;
	synchronized (this.beanDefinitionMap) {
		beanNames = new ArrayList<String>(this.beanDefinitionNames);
	}
	for (String beanName : beanNames) {
		RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
		if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
				getBean(beanName);
		}
	}
}
2. AbstractBeanFactory->getBean(String beanName);
public Object getBean(String name) throws BeansException {
	return doGetBean(name, null, null, false);
}
3.AbstractBeanFactory->doGetBean(String beanName);一个回调用来生成 bean
protected <T> T doGetBean(
		final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
		throws BeansException {
	final String beanName = transformedBeanName(name);
	Object bean;
	...
	...
	'getSingleton回调一个ObjectFactory'
	sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
		@Override
		public Object getObject() throws BeansException {
			try {
				return createBean(beanName, mbd, args);
			}catch (BeansException ex) {
				destroySingleton(beanName);
			}
		}
	});
	...
	...
	bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
	return (T) bean;
}
4. DefaultSingletonBeanRegistry.class->getSingleton:调用singletonFactory的回调来实现bean的创建
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
	synchronized (this.singletonObjects) {
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject  null) {
			...
			...
			try {
				singletonObject = singletonFactory.getObject();
			}
			...
			...
		return (singletonObject != NULL_OBJECT ? singletonObject : null);
	}
}
5. SimpleInstantiationStrategy->instantiate()
BeanDefinition: spring的bean默认映射对象
  • 创建流程:
  • 从AbstractApplicationContext->refresh():刷新context的信息。
  • obtainFreshBeanFactory():创建beanfactory,并将xml里面的bean解析成BeanDefinition,存放到beanDefinitionMap中。
  • 先从XmlReaderContext中读取配置,然后在根据配置BeanDefinitionDocumentReader
  • 分析bean
private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
	if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
		importBeanDefinitionResource(ele);
	}
	else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
		processAliasRegistration(ele);
	}
	else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
		processBeanDefinition(ele, delegate);   //加载bean
	}
	else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
		// recurse
		doRegisterBeanDefinitions(ele);
	}
}
  • BeanDefinitionReaderUtils工具类中的createBeanDefinition创建bean
public static AbstractBeanDefinition createBeanDefinition(
			String parentName, String className, ClassLoader classLoader) throws ClassNotFoundException {

		GenericBeanDefinition bd = new GenericBeanDefinition();
		bd.setParentName(parentName);
		if (className != null) {
			if (classLoader != null) {
				bd.setBeanClass(ClassUtils.forName(className, classLoader));
			}
			else {
				bd.setBeanClassName(className);
			}
		}
		return bd;
	}
  • BeanDefinition的创建组成:
1. '属性'
public abstract class AttributeAccessorSupport implements AttributeAccessor, Serializable {

	/** Map with String keys and Object values */
	private final Map<String, Object> attributes = new LinkedHashMap<String, Object>(0);
}
2. '资源'
public class BeanMetadataAttributeAccessor extends AttributeAccessorSupport implements BeanMetadataElement {

	private Object source;
}

3. '对象信息'
public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
		implements BeanDefinition, Cloneable {

	public static final String SCOPE_DEFAULT = "";
	public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO;
	public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
	public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
	public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;

	public static final int AUTOWIRE_AUTODETECT = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT;

	public static final int DEPENDENCY_CHECK_NONE = 0;
	public static final int DEPENDENCY_CHECK_OBJECTS = 1;
	public static final int DEPENDENCY_CHECK_SIMPLE = 2;
	public static final int DEPENDENCY_CHECK_ALL = 3;

	public static final String INFER_METHOD = "(inferred)";


	private volatile Object beanClass;

	private String scope = SCOPE_DEFAULT;

	private boolean abstractFlag = false;

	private boolean lazyInit = false;

	private int autowireMode = AUTOWIRE_NO;

	private int dependencyCheck = DEPENDENCY_CHECK_NONE;

	private String[] dependsOn;

	private boolean autowireCandidate = true;

	private boolean primary = false;

	private final Map<String, AutowireCandidateQualifier> qualifiers =
			new LinkedHashMap<String, AutowireCandidateQualifier>(0);

	private boolean nonPublicAccessAllowed = true;

	private boolean lenientConstructorResolution = true;

	private ConstructorArgumentValues constructorArgumentValues;

	private MutablePropertyValues propertyValues;

	private MethodOverrides methodOverrides = new MethodOverrides();

	private String factoryBeanName;

	private String factoryMethodName;

	private String initMethodName;

	private String destroyMethodName;

	private boolean enforceInitMethod = true;

	private boolean enforceDestroyMethod = true;

	private boolean synthetic = false;

	private int role = BeanDefinition.ROLE_APPLICATION;

	private String description;

	private Resource resource;
}
4. 创建:bean创建的信息
public class GenericBeanDefinition extends AbstractBeanDefinition {

	private String parentName;
}
  • BeanDefinition的使用
  • 通过SimpleInstantiationStrategy的instantiate,来创建bean对象。
public Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) {
	if (beanDefinition.getMethodOverrides().isEmpty()) {
		Constructor<?> constructorToUse;
		synchronized (beanDefinition.constructorArgumentLock) {
			constructorToUse = (Constructor<?>) beanDefinition.resolvedConstructorOrFactoryMethod;
			if (constructorToUse  null) {
				final Class<?> clazz = beanDefinition.getBeanClass();
				if (clazz.isInterface()) {
					throw new BeanInstantiationException(clazz, "Specified class is an interface");
				}
				try {
					if (System.getSecurityManager() != null) {
						constructorToUse = AccessController.doPrivileged(new PrivilegedExceptionAction<Constructor<?>>() {
							@Override
							public Constructor<?> run() throws Exception {
								return clazz.getDeclaredConstructor((Class[]) null);
							}
						});
					}
					else {
					'获取构造器'
						constructorToUse =	clazz.getDeclaredConstructor((Class[]) null);
					}
					beanDefinition.resolvedConstructorOrFactoryMethod = constructorToUse;
				}
				catch (Exception ex) {
					throw new BeanInstantiationException(clazz, "No default constructor found", ex);
				}
			}
		}
		'实例化对象'
		return BeanUtils.instantiateClass(constructorToUse);
	}
	else {
		// Must generate CGLIB subclass.
		return instantiateWithMethodInjection(beanDefinition, beanName, owner);
	}
}

2. 'BeanUtils.instantiateClass(constructorToUse)':用构造器实例化
public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws BeanInstantiationException {
	Assert.notNull(ctor, "Constructor must not be null");
	try {
		ReflectionUtils.makeAccessible(ctor);
		return ctor.newInstance(args);
	}
    ....
}