Spring Bean相关

梦开始的地方


public static void main(String[] args) {

    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    context.scan("application/context");
    // 启动应用上下文
    context.refresh();

    Knight knight = context.getBean("knight", Knight.class);
    knight.embarkOnQuest();

    // 关闭应用上下文
    context.close();

}

其中refresh方法被称为梦开始的地方。示例用的是AnnotationConfigApplicationContext,如果用ClassPathXmlApplicationContext实际上也是一样的,点进去之后能看到构造方法里面调用了refresh方法。

在refresh方法完成后,理论上不是Lazy的Bean就都加载好了。

Bean的管理

书接上文,refresh为了实现bean的创建和装配,除了生命周期管理那老三样(实例化、 属性赋值、初始化)之外,还有一个前置步骤,就是元信息的操作,包括解析、注册等等。

AbstractAutowireCapableBeanFactory 的 createBean 方法

...
// 给BeanPostProcessor一个机会返回一个代理Bean
resolveBeforeInstantiation
  applyBeanPostProcessorsBeforeInstantiation
    // 这里面要执行代理类的创建
    InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation
  applyBeanPostProcessorsAfterInitialization
    BeanPostProcessor.postProcessAfterInitialization

// 如果上一步没有返回,则开始创建真正的Bean
doCreateBean
  // Bean的实例化
  createBeanInstance
  // Bean的属性赋值
  populateBean
  // Bean的初始化
  initializeBean

BeanFactory和FactoryBean

BeanFactory:目的是替代所有用户自定义的工厂方法,用于管理所有的Bean。
FactoryBean:目的是让用户可以自定义某个Bean的组装,大部分情况下不需要使用到。

参考:https://juejin.cn/post/6844903967600836621

你可能感兴趣的:(Spring Bean相关)