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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容