说明:本系列的spring为spring boot内置,版本为2.1.1.RELEASE,ioc相关版本为5.1.3.RELEASE。
BeanDefinition
AbstractBeanDefinition 通有属性
- scope 作用域,默认是单例singleton,@Scope
- abstractFlag 该类是否用abstract修饰
- lazyInit 是否使用懒加载,@Lazy
- dependsOn 依赖,beanName数组,如果有值的话需要先实例化它,@DependsOn
- primary 该类是否有primary修饰,@Praimary
- qualifiers 该类的限定符注解相关信息 ,@Qualifier
- factoryBeanName 定义该bean的类全限定名,@Bean专有
- factoryMethodName 定义该bean的方法名称,@Bean专有
- initMethodName 初始化方法,@Bean的initMethod可指定
- destroyMethodName 销毁方法,@Bean的destroyMethod可指定
- synthetic 是否是合成的,false:应用自定义的类
- role
- 0 应用创建的bean
- 1 代表某些起支持类作用的bean,比如在一些大型的configuration类中
- 2 Spring内部自己使用的bean,不对用户开放
- role
- autowireMode 自动注入模式
- 0 AUTOWIRE_NO,什么都不做
- 1 AUTOWIRE_BY_NAME,遍历bean只有一个参数的set方法,如果不是简单类型,返回名称,如果IoC容器中含有这样的名称,则实例化(如
setPerson(Person person),则名称为person) - 2 AUTOWIRE_BY_TYPE,遍历bean只有一个参数的set方法,如果不是简单类型,返回类型,如果IoC容器中含有这样的type,则实例化(如
setPerson(Person person),则类型为Person.class)
RootBeanDefinition
- role 固定为2
- beanClass 该bean对应的类信息,实例化的对象
- scope 固定为空字符串
- resolvedTargetType 已经完成实例化的目标类,表明当前bean存储具体类的信息
- name 目标类全限定名
- annotationData 注解信息
- annotations 目标类使用的注解
- postProcessed 初始为false,实例化完成后执行applyMergedBeanDefinitionPostProcessors方法后为true,该方法作用是找到bean标有自动注入的字段和方法
ConfigurationClassBeanDefinitionReader.ConfigurationClassBeanDefinition
- factoryMethodMetadata
- access 该bean的修饰符
- returnTypeName 返回的全限定名
- methodName 定义该Bean的方法名称
- declaringClassName 该Bean所处的类全限定名,以上四者可找到该Bean的定义位置(但该Bean可能由当前类@Bean引入,也有可能是当前类的子类引入)
- attributesMap 该Bean的运行时注解信息(不包含元注解,包含注解的注解)
- annotationMetadata 定义该Bean的类信息
- annotationSet 类的注解全限定名
- metaAnnotationMap key为类的注解全限定名,value为注解的注解全限定名(不包含元注解,包含注解的注解)
- attributesMap 该Bean的运行时注解信息(不包含元注解,包含注解的注解)
- className 类的全限定名
- isInterface 是否接口
- isAnnotation 是否注解
- isAbstract 是否抽象
- isFinal 是否final
- independentInnerClass 是否内部类
- enclosingClassName 该类外部类的全限定名称,没有就为空
- superClassName 父类全限定名
- interfaces 实现的接口
- memberClassNames 类下@Component的子类全限定名
AnnotatedGenericBeanDefinition
- metadata 该Bean的相关信息,结构与annotationMetadata相同
ScannedGenericBeanDefinition
- beanClass 该类的bean全限定名,实例化的对象
- resource&value 该Bean所对应的文件路径
- metadata 该Bean的相关信息,结构与annotationMetadata相同
GenericBeanDefinition
- beanClass 该bean对应的类信息,实例化的对象
DefaultListableBeanFactory 默认的IoC容器
- mergedBeanDefinitions map集合,将beanDefinitionMap的BeanDefinition转为RootBeanDefinition
- alreadyCreated 至少已经完成过实例化的bean
- beanDefinitionMap 核心属性,key存储的是bean名,value存储的是BeanDefinition
- allBeanNamesByType key是bean对象的反射类,value是bean名称数组
- singletonBeanNamesByType 与allBeanNamesByType结构相同,区别在于singletonBeanNamesByType只存单例
- beanDefinitionNames 核心属性,容器中的bean名称集合,根据扫描到bean的顺序添加,它的长度一定等于beanDefinitionMap的key集合长度,后面篇幅的添加到bdn和bdm即为此,注意可能只会说添加到bdm,但两者是都添加的。与manualSingletonNames互斥
- hasInstantiationAwareBeanPostProcessors
- beanPostProcessors bean的后置处理器List集合,非常重要
- commonAnnotationBeanPostProcessor
- postProcessMergedBeanDefinition方法在实例化bean完成之后解析加了@Resource注解的字段
- postProcessProperties方法在依赖注入的时候处理@Resource注解
- postProcessBeforeInitialization 在依赖注入完成之后执行bean加了@PostConstruct注解的方法
- autowiredAnnotationBeanPostProcessor
- postProcessMergedBeanDefinition方法在实例化bean完成之后解析加了@Autowired,@Value注解的字段
- postProcessProperties方法在依赖注入的时候处理@Autowired,@Value注解
- commonAnnotationBeanPostProcessor
- singletonObjects 核心属性,完成创建的单例对象 key是bean名,value是bean对象,只有在完成创建之后才会添加
- registeredSingletons 注册的单例集合,实例化完成之后就会添加
- singletonsCurrentlyInCreation Set集合,当前正在创建的bean名称,创建完成后,会移除
- singletonFactories HashMap结构,未完成的单例工厂缓存,key为beanName,value为ObjectFactory对象,里面封装了bean对象,如果它创建,对应的earlySingletonObject会移除。在创建完成后,会销毁该对象
- earlySingletonObjects 未完成创建的单例对象,key是beanName,value是bean对象,如果它创建,对应的singletonFactory会移除。在创建完成后,会销毁该对象
- manualSingletonNames 手动注入到IoC容器的单例名称集合。与beanDefinitionMap和beanDefinitionNames互斥
- prototypesCurrentlyInCreation 当前正在创建的原型bean名称,创建完成后,会移除
- disposableBeans LinkedHashMap结构,key为bean名称,value为DisposableBeanAdapter对象。当bean满足摧毁条件时会放入该容器,DisposableBeanAdapter内部封装bean实例对象,beanPostProcessors是实现
DestructionAwareBeanPostProcessor且requiresDestruction(Object bean)方法为true的后置处理器 - factoryBeanObjectCache Map结构,key为beanName,value是对应的FactoryBean实现类调用
getObject()的返回值
链接:容器常用方法
附录 full与lite区别
- full属性实例化的bean会被cglib增强,lite则是普通bean,如图一
- 由full属性创建的bean都是单例的,而lite则不能保证,如图二图三
图一
图二:lite属性下创建的User对象实例
图三:full属性下创建的User对象实例