vc+ mfc 方法怎么被调用_Spring源码阅读(二)我的方法是怎么被自动调用的
曾几何时,我们在写Java代码时,写好一个类,然后去创建这个类的对象,再调用它的方法,项目可能变得有些冗余,但却其乐融融,因为我知道程序每一步干了什么,
但现在,时代变了,你发现我往往只需要实现一个接口,项目一跑起来,我的实现类中的方法就自动被调用了,这究竟是怎么实现的呢?
不考虑源码具体实现,我们先自己想想这种功能怎么做,
- 首先要获取到该接口下所有的实现类(这里统一称为实现类),由于是demo代码,并不像Spring那样我们会提前在web.xml中配置好Bean的全限定名,反射中没有直接提供给我们方法来根据接口获取所有实现类的方法,我去网上找了一篇文章:java 根据接口获取所有的实现类,将类权限定名放在一个map中
- 有了所有实现类后,我们写个Processor类,在该类中去调用实现类的方法,这里可以考虑将map中所有实现类遍历并反射创建,然后直接去调用实现类中指定的方法
以上方案是可行的,并且当接口不止一个的时候,我们可以在遍历实现类的时候用instanceof去判断该实现类属于哪个接口,从而去调哪个方法,
当接口多到爆炸的时候,我们可以考虑抽一个Processor接口,实现各种各样的Processor,不同类型的Processor处理不同的接口,然后弄一个抽象类,该抽象类中会去遍历所有Processor和实现类,一个双重for循环,这么说你懂我意思把,如果Processor和实现类匹配的话,那就用这个Processor去调用这个实现类,
刚刚说了匹配,如何匹配?
PlayGameProcessor处理器处理PlayGame接口
PlayGame接口中有个playGame()方法
PlayGameProcessor{
if(bean instanceof PlayGame){
(PlayGame)bean.playGame();
}
}
其实Spring中就是这么实现的
理了一下思路,现在来看看Spring中的实现,
首先我实现一个ApplicationContextAware接口,
debug项目,
我们看看调用栈,
依次来看看,
首先是invokeAwareInterfaces方法,他在ApplicationContextAwareProcessor类中,用于处理Aware接口,
接下来的ApplicationContextAwareProcessor#postProcessBeforeInitialization就调用了invokeAwareInterfaces并传递了Bean,
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization适配了实现类和Processor,
这不正是和之前说的大致相同嘛,操作的原理都是一致的,只是Spring处理得更加细腻
vc+ mfc 方法怎么被调用_Spring源码阅读(二)我的方法是怎么被自动调用的相关推荐
- mybatis源码阅读(二):mybatis初始化上
转载自 mybatis源码阅读(二):mybatis初始化上 1.初始化入口 //Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与 ...
- mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...
前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...
- 【转载】ubuntu下linux内核源码阅读工具和调试方法总结
http://blog.chinaunix.net/space.php?uid=20940095&do=blog&cuid=2377369 一 linux内核源码阅读工具 window ...
- LeGo-LOAM激光雷达定位算法源码阅读(二)
文章目录 1.featureAssociation框架 1.1节点代码主体 1.2 FeatureAssociation构造函数 1.3 runFeatureAssociation()主体函数 2.重 ...
- spring依赖注入_Spring源码阅读:Spring依赖注入容器
依赖注入 依赖注入是Spring框架最核心的能力,Spring框架提供的AOP,WebMVC等其它功能都是以依赖注入容器作为基础构建的,Spring依赖注入容器类似于一个用于组装对象的框架内核,任何应 ...
- action mutation 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...
module与moduleCollection你一定要会啊!Vuex源码学习(五)加工后的module 在组件中使用vuex的dispatch和commit的时候,我们只要把action.mutati ...
- 使用base标签后图片无法加载_Spring 源码学习(二)-默认标签解析
`Spring` 解析默认标签~ 从上一篇笔记可以看出,在容器注册 bean 信息的时候,做了很多解析操作,而 xml 文件中包含了很多标签.属性,例如 bean . import 标签, meta ...
- java spring ioc 实例_Spring 源码阅读(IOC容器)-bean的实例化以及注入
3.Bean的实例化以及注入过程分析 Bean的实例以及注入是在getBean时触发的,由于外部容器是与外部调用交互的桥梁,我们首先从外部容器入手,AbstractApplicationContext ...
- DBFace: 源码阅读(二)
上篇链接 看LZ上篇博客的时间竟然是7月18日,着实是懈怠了,其实有很多东西需要总结归纳,这周末就补一下之前欠的债吧 上篇主要介绍了DBFace的大体框架,这篇主要介绍数据的预处理部分 5. 数据预处 ...
最新文章
- sys.check_constraints
- go 清空文件内容_玩转Go单元测试,你只需要掌握这5点
- Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架
- Spring事件机制Event源码解析(未完待续)
- edpluse怎么运行c语言,[JSP]小菜也来学Editplus+Tomcat配置jsp运行环境
- SpringMVC框架----请求参数的绑定
- 神奇的go语言(image网站开发)
- Linux iptables 防火墙常用规则
- log4j 打印线程号配置_Log4J日志整合及配置详解
- 后端开发都应该掌握的Redis基础
- 【风速预测】基于matlab EMD+模拟退火算法优化DBN风速预测【含Matlab源码 JQ003期】
- java 接收soap_2.技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化...
- 分享个最终幻想勇气启示录脚本,手游上能一键推图自动升级
- linux多人共享桌面,gnome 开远程桌面共享功能(linux启动多个桌面)
- linux英英词典项目,五大主流英英词典(ESL)比较使用测评报告
- 手机里tencent文件夹能删吗_华为手机中的文件夹代表什么,哪些可以删除,看完秒懂-tencent是什么文件夹...
- S=A-BIS-dS+u2w2I+u1w1E数模作业
- HLS流媒体服务器对性能要求,搭建hls直播流媒体服务器有什么要求?
- 小米与vivo相争,高通成为最大受益者
- 【Java中继承总结与练习 】