SpringBoot IoC(1)常用对象属性

1,405 阅读5分钟

说明:本系列的spring为spring boot内置,版本为2.1.1.RELEASE,ioc相关版本为5.1.3.RELEASE。

BeanDefinition

参考:不同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,不对用户开放
  • 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注解
  • 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是实现DestructionAwareBeanPostProcessorrequiresDestruction(Object bean)方法为true的后置处理器
  • factoryBeanObjectCache Map结构,key为beanName,value是对应的FactoryBean实现类调用getObject()的返回值

链接:容器常用方法

附录 full与lite区别

  1. full属性实例化的bean会被cglib增强,lite则是普通bean,如图一
  2. 由full属性创建的bean都是单例的,而lite则不能保证,如图二图三

图一 图二:lite属性下创建的User对象实例 图三:full属性下创建的User对象实例