Spring Bean相关
2021-10-20 本文已影响0人
elon_wen
梦开始的地方
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的组装,大部分情况下不需要使用到。