Spring IoC源码分析
总览
具体说明
1. 初始化Ioc容器
-
核心思想:首先创建Bean工厂对象DefaultListableBeanFactory,然后委托给多个阅读器(如:BeanDefinitionDocumentReader、BeanDefinitionParserDelegate等)解析配置元数据,加载Bean定义,最后存入本地缓存 Map<String, BeanDefinition> beanDefinitionMap
-
整体跳转流程:AbstractApplicationContext#obtainFreshBeanFactory() -> AbstractApplicationContext#refreshBeanFactory() -> AbstractRefreshableApplicationContext#refreshBeanFactory() -> AbstractRefreshableApplicationContext#loadBeanDefinitions() -> AbstractXmlApplicationContext#loadBeanDefinitions() -> XmlBeanDefinitionReader#loadBeanDefinitions() -> XmlBeanDefinitionReader#doLoadBeanDefinitions() -> XmlBeanDefinitionReader#registerBeanDefinitions() -> BeanDefinitionDocumentReader#registerBeanDefinitions() -> DefaultBeanDefinitionDocumentReader#registerBeanDefinitions() -> DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions(Element root)
-
核心代码分析
//入口 @Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh"); //初始化前的准备 prepareRefresh(); // =========初始化Ioc容器=========== ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 为Ioc容器集成各个功能:如BeanPostProcessor、EnvironmentAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware等 prepareBeanFactory(beanFactory); try { //bean工厂后置扩展器 postProcessBeanFactory(beanFactory); StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process"); //实例化并调用所有已注册的BeanFactoryPostProcessor invokeBeanFactoryPostProcessors(beanFactory); //实例化并注册所有BeanPostProcessor registerBeanPostProcessors(beanFactory); beanPostProcess.end(); // 初始化消息源 initMessageSource(); // 初始化事件广播器 initApplicationEventMulticaster(); // 初始化其他特殊bean onRefresh(); // 注册监听器(添加实现ApplicationListener的bean) registerListeners(); // ======实例化Bean======= finishBeanFactoryInitialization(beanFactory); // 完成应用上下文的刷新:清除资源缓存、初始化应用上下文的生命周期处理器、事件发布给所有监听器等 finishRefresh(); }catch (BeansException ex) { //异常执行回滚操作 destroyBeans(); cancelRefresh(ex); throw ex; }finally { resetCommonCaches(); contextRefresh.end(); } } } //管理bean工厂的生命周期 @Override protected final void refreshBeanFactory() throws BeansException { //关闭之前的bean工厂 if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } //初始化一个新的bean工厂 try { //创建一个内部bean工厂 BeanFactory DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); //设置bean工厂 customizeBeanFactory(beanFactory); //加载bean定义:将bean定义加载到给定的bean工厂中,通常是通过委托给一个或多个bean定义阅读器。 //通过委托给XmlBeanDefinitionReader对象加载bean定义 loadBeanDefinitions(beanFactory); this.beanFactory = beanFactory; } catch (IOException ex) { throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); } } //委托XmlBeanDefinitionReader对象,加载bean定义 @Override protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException { // 为给定的bean工厂创建一个XmlBeanDefinitionReader对象 XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); //为XmlBeanDefinitionReader对象设置环境、资源加载器、实体类资源等 beanDefinitionReader.setEnvironment(this.getEnvironment()); beanDefinitionReader.setResourceLoader(this); beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this)); //初始化XmlBeanDefinitionReader对象 initBeanDefinitionReader(beanDefinitionReader); //加载bean定义 loadBeanDefinitions(beanDefinitionReader); } //XmlBeanDefinitionReader加载bean定义 protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException { //1. 获取bean定义资源路径 Resource[] configResources = getConfigResources(); if (configResources != null) { //2. 加载bean定义:xml配置文件、properties配置文件、Groovy脚本 reader.loadBeanDefinitions(configResources); } String[] configLocations = getConfigLocations(); if (configLocations != null) { reader.loadBeanDefinitions(configLocations); } }
2. 实例化Bean、Bean属性赋值、初始化Bean
- 核心思想:利用反射技术,根据bean定义中的路径找到bean对应的类完成bean实例化、属性赋值操作、利用回调完成初始化操作
- 整体跳转流程:
- 实例化Bean:AbstractApplicationContext#finishBeanFactoryInitialization() -> ConfigurableListableBeanFactory#preInstantiateSingletons() -> DefaultListableBeanFactory#preInstantiateSingletons() -> DefaultListableBeanFactory#getBean() -> AbstractBeanFactory#getBean() -> AbstractBeanFactory#doGetBean() -> AbstractBeanFactory#createBean() -> AbstractAutowireCapableBeanFactory#createBean() -> AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation() -> InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation() -> AbstractAutowireCapableBeanFactory#doCreateBean() -> AbstractAutowireCapableBeanFactory#createBeanInstance() -> BeanWrapper
- 属性赋值:AbstractAutowireCapableBeanFactory#populateBean() -> InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation() -> MutablePropertyValues#List
- 初始化Bean:AbstractAutowireCapableBeanFactory#initializeBean() -> AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization() -> AbstractAutowireCapableBeanFactory#invokeInitMethods() -> AbstractAutowireCapableBeanFactory#invokeCustomInitMethod() -> AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization() -> Object wrappedBean -> Map<String, Object>
- 核心源码分析
//实例化Bean、Bean属性赋值、初始化Bean protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { //1. 实例化Bean BeanWrapper instanceWrapper = null; if (instanceWrapper == null) { instanceWrapper = createBeanInstance(beanName, mbd, args); } //... Object exposedObject = bean; try { //2. 依赖注入Bean属性赋值 populateBean(beanName, mbd, instanceWrapper); //3. 初始化Bean exposedObject = initializeBean(beanName, exposedObject, mbd); } //... return exposedObject; } //实例化Bean protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { //验证bean对应的类是否可以实例化 Class<?> beanClass = resolveBeanClass(mbd, beanName); ... //使用工厂方法对bean进行实例化 if (mbd.getFactoryMethodName() != null) { return instantiateUsingFactoryMethod(beanName, mbd, args); } ... //使用构造函数进行实例化 Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); if (ctors != null || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR || mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) { return autowireConstructor(beanName, mbd, ctors, args); } //使用默认的构造函数进行实例化 return instantiateBean(beanName, mbd); } //Bean属性赋值 protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { //... boolean continueWithPropertyPopulation = true; if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; //实例化后置处理 if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) { continueWithPropertyPopulation = false; break; } } } } //依赖注入 PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null); if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { MutablePropertyValues newPvs = new MutablePropertyValues(pvs); //根据Autowire注入 if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) { autowireByName(beanName, mbd, bw, newPvs); } if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { autowireByType(beanName, mbd, bw, newPvs); } pvs = newPvs; } //... //根据PropertyValues注入 if (pvs != null) { applyPropertyValues(beanName, mbd, bw, pvs); } } //初始化Bean protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { //调用AwareMethods设置bean的BeanName、BeanClassLoader、BeanFactory属性 invokeAwareMethods(beanName, bean); //... Object wrappedBean = bean; //后置扩展器:初始化前的自定义操作 if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); } try { //调用初始化Bean方法 invokeInitMethods(beanName, wrappedBean, mbd); } //... //后置扩展器:初始化后的自定义操作 if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix