网站商城建设,网站快捷按钮以什么方式做,部署php网站,推广计划名称概述面向资源#xff08;XML、Properties#xff09;、面向注解定义的 Bean 是如何被解析成 BeanDefinition#xff08;Bean 的“前身”#xff09;#xff0c;并保存至 BeanDefinitionRegistry 注册中心里面#xff0c;实际也是通过 ConcurrentHashMap 进行保存。Spring…概述面向资源XML、Properties、面向注解定义的 Bean 是如何被解析成 BeanDefinitionBean 的“前身”并保存至 BeanDefinitionRegistry 注册中心里面实际也是通过 ConcurrentHashMap 进行保存。Spring 底层 IoC 容器 DefaultListableBeanFactory实现了 BeanFactory 和 BeanDefinitionRegistry 接口这个时候它处于“就绪状态”当我们显示或者隐式地调用 getBean(...) 方法时会触发加载 Bean 阶段获取对应的 Bean。在该方法中如果是单例模式会先从缓存中获取已有则直接返回没有则根据 BeanDefinition 开始创建这个 Bean。主体流程getBean doGetBean createBean doCreateBean createBeanInstance、instantiate、populateBean、initializeBean、registerDisposableBeanIfNecessary注册销毁方法BeanFactory 体系结构下来熟悉下Sprig容器BeanFactory的体系org.springframework.beans.factory.BeanFactorySpring IoC 容器最基础的接口提供依赖查找单个 Bean 的功能org.springframework.beans.factory.ListableBeanFactory继承 BeanFactory 接口提供依赖查找多个 Bean 的功能org.springframework.beans.factory.HierarchicalBeanFactory继承 BeanFactory 接口提供获取父 BeanFactory 的功能具有层次性org.springframework.beans.factory.config.ConfigurableBeanFactory继承 HierarchicalBeanFactory 接口提供可操作内部相关组件的功能具有可配置性org.springframework.beans.factory.config.AutowireCapableBeanFactory继承 BeanFactory 接口提供可注入的功能支持依赖注入org.springframework.beans.factory.config.ConfigurableListableBeanFactory继承上面所有接口综合所有特性还提供可提前初始化所有单例 Bean 的功能org.springframework.beans.factory.support.DefaultListableBeanFactorySpring 底层 IoC 容器依赖注入的底层实现getBean(String name) 方法根据名称获取 Bean当然还有许多重载方法最终都会调用 doGetBean(String name, Nullable ClassT requiredType, Nullable Object[] args, boolean typeCheckOnly) 方法下面是编程方法获取Bean对象的方法 // 创建 BeanFactory 容器DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();XmlBeanDefinitionReader reader new XmlBeanDefinitionReader(beanFactory);// XML 配置文件 ClassPath 路径String location classpath:dependency-lookup-context.xml;// 加载配置int beanDefinitionsCount reader.loadBeanDefinitions(location);System.out.println(Bean 定义加载的数量 beanDefinitionsCount);// 依赖查找System.out.println(beanFactory.getBean(user,1,jack2));按照这个代码调试整理成下图的流程图下图是关于doGetBean 方法这一层的执行逻辑。其他的核心方法后面在更新文章。总结可以看到这个方法加载 Bean 的过程中会先从缓存中获取单例模式的 Bean不管是从缓存中获取的还是新创建的都会进行处理如果是 FactoryBean 类型则调用其 getObject() 获取目标对象BeanFactory 可能有父容器如果当前容器找不到 BeanDefinition 则会尝试让父容器创建创建 Bean 的任务交由 AbstractAutowireCapableBeanFactory 去完成如果获取到的 Bean 不是我们想要类型会通过类型转换机制转换成目标类型获取 beanName从缓存中获取单例 BeanFactoryBean 的处理非单例模式依赖检查BeanFactory 层次性加载 Bean 策略将 beanName 标记为已创建获取 RootBeanDefinition依赖 Bean 的处理不同作用域的 Bean 的创建单例模式多例模式其他模式过程如下从当前容器获取该模式的 Scope 对象 scope不存在则抛出异常从 scope 中获取 beanName 对应的对象看你的具体实现不存在则执行原型模式的四个步骤进行创建想要自定义一个作用域可以实现 org.springframework.beans.factory.config.Scope 接口并往 Spring 应用上下文注册即可 这个也是一个拓展接口类型转换如果入参 requiredType 不为空并且 Bean 不是该类型则需要进行类型转换过程如下通过类型转换机制将 Bean 转换成 requiredType 类型对 Spring 的类型转换机制参考 org.springframework.core.convert.support.DefaultConversionService 我们也可以基于此做拓展的。转换后的 Bean 为空则抛出异常返回类型转换后的 Bean 对象归纳拓展对 BeanFactory 接口的体系结构进行了分析得知 DefaultListableBeanFactory 是 BeanFactory 的最底层实现也就是 Spring 的底层 IoC 容器。接着分析了 AbstractBeanFactory 的 getBean(...) 方法当我们显示或者隐式地调用这个方法时会触发 Bean 的加载。上面对 Bean 的加载过程进行了分析。不同作用域的 Bean 的创建底层都会调用 AbstractAutowireCapableBeanFactory 的 createBean(...)方法进行创建创建 Bean 的过程涉及到 Bean 生命周期的大部分阶段例如实例化阶段、属性赋值阶段、Aware 接口回调阶段、初始化阶段都是在这个方法中完成的。