这里我们主要分析生命周期从以下方法进入:
bean的实例化(开辟内存空间)-》bean的属性填充-》bean的初始化;
SpringBean的加载肯定是找到Bean的定义信息,来源有xml、yml等文件;
调用如下入口方法,加载配置文件进入源码解析;
先缕清大体脉络,后深入;
入口:
ClassPathXmlApplicationContext()创建spring以用程序上下文, 调用构造方法,设置配置文件路径到当前应用程序中,开始进入容器的创建和刷新环节 refresh(); AbstractApplicationContext()的refresh();
bean的生命周期从创建到销毁共12个流程方法,总体流程脉络如下:
// 刷新spring容器前的准备,例如清空缓存 prepareRefresh();
// 获取一个全新的工厂bean ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 设置一些bean工厂的属性 lijiaqi prepareBeanFactory(beanFactory);
// 注册bean的增强器 postProcessBeanFactory(beanFactory); // 调用上面注册的bean工厂的增强器(bean工厂) invokeBeanFactoryPostProcessors(beanFactory); // 注册所有的 Bean 后处理器(bean) registerBeanPostProcessors(beanFactory); // 用于初始化消息源 ! initMessageSource(); // 用于初始化事件多播器! initApplicationEventMulticaster(); // 模板方法模式,用于执行特定方法 onRefresh(); // 注册所有的监听器 registerListeners(); // 完成非惰性单例的实例化 finishBeanFactoryInitialization(beanFactory); // 发布相应的事件 finishRefresh();
bean的实例化主要方法(spring最易懂,只有do开头才是干事的方法)
记住下面流程的方法顺序我们在源码中找出来
getBean()->doGetBean()->createBean()->doCreateBean()->createBeanInstance()->instantiateBean()->instantiate()->BeanUtils.instantiateClass(constructorToUse)->ctor.newInstance(argsWithDefaultValues)->T inst = (T) ca.newInstance(initargs);
// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early. // 从容器中获取了所有实现了LoadTimeWeaverAware接口的bean名称(需要增强的bean实现的接口) // 初始化这些bean,这些bean收到通知注册各自的类和相关切入点 String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false); for (String weaverAwareName : weaverAwareNames) { getBean(weaverAwareName); }
// 实例化所有剩余(非惰性初始化)单例。 beanFactory.preInstantiateSingletons(); 进入看到我们的getBean() 工厂bean和普通单例bean走不同的getBean() 进去看见我们的doGetBean()
经过一系列判断看到我们的createBean(),创建bean的实例对象
这里强调一下
sharedInstance = getSingleton(beanName, () -> { try { //入口 return createBean(beanName, mbd, args); }
传入的是一个lambda表达式,在接收的参数对象调用其唯一抽象方法时调用;
在解释一下mbd,是RootBeanDefinition类型的,MBD(MergedBeanDefinition)表示合并后的BeanDefinition。在Spring容器中,一个bean可以有一个或多个BeanDefinition,例如,在多个配置文件或注解中定义同一个bean。在这种情况下,Spring容器需要合并这些BeanDefinition以创建一个统一的BeanDefinition,这就是MBD的作用。
之后就是我们的doCreateBean();
反射创建对象,
instantiateBean(beanName,mbd)->使用其默认构造函数实例化给定的 Bean
->instantiate(mdb,beanName,beanFactory)->获取其构造器传入BeanUtils.instantiateClass(constructorToUse);
一层层返回到拿到一个BeanWrapper
BeanWrapper是Spring提供的一个用来操作JavaBean属性的工具类
对合成后的MergedBeanDefinition进行一些后置处理
填充属性
populateBean(beanName, mbd, instanceWrapper);