BeanDefinition

  1. Spring根据BeanDefinition来创建Bean对象, BeanDefinition有很多属性用来描述Bean对象
  2. BeanDefinition中的重要属性:
  1. beanClass: 表示一个bean的类型, Spring在创建过程中通过该属性实例化得到对象
  2. scope: 表示一个bean的作用域, sington代表是一个单例bean, prototype代表是一个原型bean
  3. isLazy: 表示该bean是否需要懒加载, 如果scope = prototype时该属性不起作用, 懒加载会在getBean时生成bean, 非懒加载会在Spring容器启动时生成bean
  4. dependsOn: 表示一个bean创建之前依赖的其他bean, 在该bean创建之前, 它所依赖的bean需要全部创建完成
  5. primary: 表示该bean是主bean, 依赖注入时, 如果找到多个相同类型的bean, 会判断是否存在主bean, 如果存在会把主bean注入到属性中
  6. initMethodName: bean的生命周期中有一个步骤叫初始化, Spring会在初始化时调用该方法, 由程序员自己编写
  1. @Component, @Bean, <bean>都会解析为BeanDefinition

BeanFactory

  1. BeanFactory是一种"Spring容器", 用来获取bean
  2. BeanFactory根据BeanDefinition来创建bean对象

Bean的生命周期

  1. 看这里

@Autowired是如何工作的

  1. 当@Autowired加在属性上后, Spring在生命周期属性填充这一步骤时, 会基于实例化出来的对象对属性进行赋值
  2. Spring会在容器中找到所有该类型的bean对象, 如果有多个则会根据名字来确定, 如果required属性为true, 但没有找到相应类型的对象, 则会抛异常
  3. 当@Autowired加在方法上后, Spring会在属性填充阶段会在容器中根据参数类型, 参数名字找到对象当作方法入参, 自动反射调用该方法