本来昨天在看 spring frame的八股, 看到了IOC部分,但是实在看不懂是什么东西,讲是讲源码部分,但又不完全讲,我想着那我要不自己看一下源码

这是我画的Bean Factory的大致关系图

删去了bean别名管理接口(AliasRegistry)和bean定义接口(BeanDefinitionRegistry)避免复杂理解

BeanFactory有三个子类ListableBeanFactoryHierarchicalBeanFactoryConfigurableBeanFactoryAutowireCapableBeanFactory

我们先来看看BeanFactory 只实现了IOC 容器的基本行为规范,好比是让需求方提出对目标的需求。

public interface BeanFactory {
//与FactoryBean创建的bean区分开来, 若命名的bean是FactoryBean,
//则获取将返回Factory,而不是Factory返回的实例。
String FACTORY_BEAN_PREFIX = "&"; Object getBean(String var1) throws BeansException; <T> T getBean(String var1, Class<T> var2) throws BeansException; Object getBean(String var1, Object... var2) throws BeansException; <T> T getBean(Class<T> var1) throws BeansException; <T> T getBean(Class<T> var1, Object... var2) throws BeansException; <T> ObjectProvider<T> getBeanProvider(Class<T> var1); <T> ObjectProvider<T> getBeanProvider(ResolvableType var1); boolean containsBean(String var1); boolean isSingleton(String var1) throws NoSuchBeanDefinitionException; boolean isPrototype(String var1) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException; @Nullable
Class<?> getType(String var1) throws NoSuchBeanDefinitionException; @Nullable
Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException; String[] getAliases(String var1);
}

ListableBeanFactory 定义了Factory Bean的可枚举性,适用于批量操作 bean 的场景

public interface ListableBeanFactory extends BeanFactory {
boolean containsBeanDefinition(String var1); int getBeanDefinitionCount(); String[] getBeanDefinitionNames(); <T> ObjectProvider<T> getBeanProvider(Class<T> var1, boolean var2); <T> ObjectProvider<T> getBeanProvider(ResolvableType var1, boolean var2); String[] getBeanNamesForType(ResolvableType var1); String[] getBeanNamesForType(ResolvableType var1, boolean var2, boolean var3); String[] getBeanNamesForType(@Nullable Class<?> var1); String[] getBeanNamesForType(@Nullable Class<?> var1, boolean var2, boolean var3); <T> Map<String, T> getBeansOfType(@Nullable Class<T> var1) throws BeansException; <T> Map<String, T> getBeansOfType(@Nullable Class<T> var1, boolean var2, boolean var3) throws BeansException; String[] getBeanNamesForAnnotation(Class<? extends Annotation> var1); Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> var1) throws BeansException; @Nullable
<A extends Annotation> A findAnnotationOnBean(String var1, Class<A> var2) throws NoSuchBeanDefinitionException; @Nullable
<A extends Annotation> A findAnnotationOnBean(String var1, Class<A> var2, boolean var3) throws NoSuchBeanDefinitionException;
}

HierarchicalBeanFactory 定义了Bean Factory的分层能力

之前还不知道Bean Factory可以有父子容器区分

Spring MVC 有以下分层

  • 根上下文(ContextLoaderListener 或 Spring Boot 创建)作为父容器。

如服务层、数据访问层和基础设施 bean(DataSource)。

  • DispatcherServlet 的上下文作为子容器。

定义 Web 层特定 bean,如控制器、HandlerMapping 等。

public interface HierarchicalBeanFactory extends BeanFactory {
@Nullable
BeanFactory getParentBeanFactory(); boolean containsLocalBean(String var1);
}

ConfigurableBeanFactory 定义了自定义Bean工厂的能力 , 自定义类加载器、beany定义、作用域、依赖关系。


public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
// 自定义类加载器
void setBeanClassLoader(@Nullable ClassLoader var1);
@Nullable
ClassLoader getBeanClassLoader();
void setTempClassLoader(@Nullable ClassLoader var1);
@Nullable
ClassLoader getTempClassLoader(); // bean 定义
void setCacheBeanMetadata(boolean var1);
boolean isCacheBeanMetadata();
BeanDefinition getMergedBeanDefinition(String var1) throws NoSuchBeanDefinitionException;
boolean isFactoryBean(String var1) throws NoSuchBeanDefinitionException; // 作用域
void registerScope(String var1, Scope var2);
String[] getRegisteredScopeNames();
@Nullable
Scope getRegisteredScope(String var1); // 依赖关系
void registerDependentBean(String var1, String var2);
String[] getDependentBeans(String var1);
String[] getDependenciesForBean(String var1); ......
......
}

AutowireCapableBeanFactory 实现了Bean自动装配能力

public interface AutowireCapableBeanFactory extends BeanFactory {
int AUTOWIRE_NO = 0;
int AUTOWIRE_BY_NAME = 1;
int AUTOWIRE_BY_TYPE = 2;
int AUTOWIRE_CONSTRUCTOR = 3;
/** @deprecated */
@Deprecated
int AUTOWIRE_AUTODETECT = 4;
String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL"; <T> T createBean(Class<T> var1) throws BeansException; void autowireBean(Object var1) throws BeansException; Object configureBean(Object var1, String var2) throws BeansException; Object createBean(Class<?> var1, int var2, boolean var3) throws BeansException; Object autowire(Class<?> var1, int var2, boolean var3) throws BeansException; void autowireBeanProperties(Object var1, int var2, boolean var3) throws BeansException; void applyBeanPropertyValues(Object var1, String var2) throws BeansException; Object initializeBean(Object var1, String var2) throws BeansException; Object applyBeanPostProcessorsBeforeInitialization(Object var1, String var2) throws BeansException; Object applyBeanPostProcessorsAfterInitialization(Object var1, String var2) throws BeansException; void destroyBean(Object var1); <T> NamedBeanHolder<T> resolveNamedBean(Class<T> var1) throws BeansException; Object resolveBeanByName(String var1, DependencyDescriptor var2) throws BeansException; @Nullable
Object resolveDependency(DependencyDescriptor var1, @Nullable String var2) throws BeansException; @Nullable
Object resolveDependency(DependencyDescriptor var1, @Nullable String var2, @Nullable Set<String> var3, @Nullable TypeConverter var4) throws BeansException;
}

看完了这些接口类和接口方法,对IOC容器有了更扩展一些的理解

其实源码还是挺容易看的,先通过一个类向上找到基类,再往下看详细的接口类,实现类。 对其有一个全局的理解

以接口肢解bean factory,源码没那么神秘的更多相关文章

  1. Spring中Bean命名源码分析

    Spring中Bean命名源码分析 一.案例代码 首先是demo的整体结构 其次是各个部分的代码,代码本身比较简单,不是我们关注的重点 配置类 /** * @Author Helius * @Crea ...

  2. Python 基于python实现的http接口自动化测试框架(含源码)

    基于python实现的http+json协议接口自动化测试框架(含源码) by:授客 QQ:1033553122      欢迎加入软件性能测试交流 QQ群:7156436  由于篇幅问题,采用百度网 ...

  3. python+requests接口自动化完整项目设计源码

    前言 有很多小伙伴吵着要完整的项目源码,完整的项目属于公司内部的代码,这个是没法分享的,违反职业道德了,就算别人分享了,也只适用于本公司内部的业务. 所以用例的代码还是得自己去一个个写,我只能分享项目 ...

  4. python+requests接口自动化完整项目设计源码(一)

    原文地址https://www.cnblogs.com/yoyoketang/tag/python接口自动化/ 原文地址https://www.cnblogs.com/yoyoketang/ 原文地址 ...

  5. python+requests接口自动化完整项目设计源码【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python%E6%8E%A5%E5%8F%A3%E8%87%AA%E5%8A%A8%E ...

  6. Python接口自动化测试实战-----附源码

    目录 1. 接口定义 2. 基本流程 3. 需求分析 4. 用例设计 5. 脚本开发 6. 结果分析 接口定义: 接口普遍有两种意思,一种是API(Application Program Interf ...

  7. 微信公众平台开发-微信服务器IP接口实例(含源码)

    微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 学习了access_token的获取及应用后,正式的使用access_token ...

  8. 物流一站式单号查询之快递鸟API接口(附Demo源码)

    连载篇提前看 物流一站式单号查询之快递鸟API接口 物流一站式查询之TrackingMore篇 物流一站式查询之顺丰接口篇 物流一站式查询之快递100 前情提要 前三篇中,我们已经从注册.申请接口.调 ...

  9. factory源码分析——component_registry和object_registry

    registry类主要是为object和component提供一个轻量级的代理(lightweight proxy)来方便factory实现: registry class从uvm_object_wr ...

  10. 【Spring源码分析】非懒加载的单例Bean初始化前后的一些操作

    前言 之前两篇文章[Spring源码分析]非懒加载的单例Bean初始化过程(上篇)和[Spring源码分析]非懒加载的单例Bean初始化过程(下篇)比较详细地分析了非懒加载的单例Bean的初始化过程, ...

随机推荐

  1. MySQL查询当前连接数的语句

    1. 查看当前总连接数 SHOW STATUS LIKE 'Threads_connected'; 返回当前建立的连接总数 2. 查看最大连接数配置 SHOW VARIABLES LIKE 'max_ ...

  2. udl(Universal Data Link)通用数据连接文件

    新建文本文档 更改后缀名为.udl(注意小点) 然后打开运行 配置并测试 改回后缀名.txt(有个小点哦) 打开就是了

  3. unigui的ServerModule的重要属性【8】

    ServerModule是unigui的重要模块. uniGUI 服务器的内部结构. 每个 uniGUI 服务器都有一个ServerModule的副本, 每台服务器创建一次, 同时根据用户活动动态创建 ...

  4. 附042.Kubernetes_v1.32.3生成环境高可用部署

    目录 部署组件 kubeadm介绍 kubelet介绍 kubectl介绍 方案概述 方案介绍 部署规划 节点规划 主机名配置 变量准备 互信配置 环境预配置 部署高可用组件 HAProxy安装 Ke ...

  5. grequests,并发执行接口请求的方法(简易版)

    有时候需要处理很多请求,显然,一个一个去处理是要花费很多时间的 我们就需要用到并发的方式,python并发请求的方法很多,从简单到复杂. 本案例,介绍一个超级简单,使用grequests库,实现并发请 ...

  6. DPDI(Dispatch PDI)kettle调度管理平台升级预告

    亲爱的DPDI用户们,久等了!Dispatch PDI全新升级,焕然一新的UI页面计划于2025.03.23正式上线.这一次,我们精心打磨每一个细节,只为给您带来前所未有的丝滑体验,让每一次浏览都成为 ...

  7. SkyWalking服务监控简单配置【Windows版本】

    SkyWalking是什么 skywalking是一个可观测性分析平台和应用性能管理系统专为微服务.云原生架构和基于容器(Docker.K8s.Mesos)架构而设计. 下载 官网:https://s ...

  8. 通达OA前台任意用户登录漏洞+RCE漏洞复现

    声明 本文仅用于技术交流,请勿用于非法用途 由于传播.利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任. 文章作者拥有对此文章的修改和解释权.如 ...

  9. xl2411p 显示器分辨率问题 IPS\TN

    本来是想玩游戏来着,后来也没能玩起: 留下了个显示器明基xl2411p,昨天扒出来用起来吧. 玩游戏没毛病的,毕竟都是图片不存在文字的渲染问题,日常办公用起来就难受了,TN屏真是难受的了. 本来24寸 ...

  10. java基础之“深复制和浅复制的区别”

    一.浅复制 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都任然指向原来的对象. 二.深复制 深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用对象 三.举例 产品 ...