曾几何时,我们在写Java代码时,写好一个类,然后去创建这个类的对象,再调用它的方法,项目可能变得有些冗余,但却其乐融融,因为我知道程序每一步干了什么,

但现在,时代变了,你发现我往往只需要实现一个接口,项目一跑起来,我的实现类中的方法就自动被调用了,这究竟是怎么实现的呢?

不考虑源码具体实现,我们先自己想想这种功能怎么做,

  1. 首先要获取到该接口下所有的实现类(这里统一称为实现类),由于是demo代码,并不像Spring那样我们会提前在web.xml中配置好Bean的全限定名,反射中没有直接提供给我们方法来根据接口获取所有实现类的方法,我去网上找了一篇文章:java 根据接口获取所有的实现类,将类权限定名放在一个map中
  2. 有了所有实现类后,我们写个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源码阅读(二)我的方法是怎么被自动调用的相关推荐

  1. mybatis源码阅读(二):mybatis初始化上

    转载自  mybatis源码阅读(二):mybatis初始化上 1.初始化入口 //Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与 ...

  2. mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...

  3. 【转载】ubuntu下linux内核源码阅读工具和调试方法总结

    http://blog.chinaunix.net/space.php?uid=20940095&do=blog&cuid=2377369 一 linux内核源码阅读工具 window ...

  4. LeGo-LOAM激光雷达定位算法源码阅读(二)

    文章目录 1.featureAssociation框架 1.1节点代码主体 1.2 FeatureAssociation构造函数 1.3 runFeatureAssociation()主体函数 2.重 ...

  5. spring依赖注入_Spring源码阅读:Spring依赖注入容器

    依赖注入 依赖注入是Spring框架最核心的能力,Spring框架提供的AOP,WebMVC等其它功能都是以依赖注入容器作为基础构建的,Spring依赖注入容器类似于一个用于组装对象的框架内核,任何应 ...

  6. action mutation 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    module与moduleCollection你一定要会啊!Vuex源码学习(五)加工后的module 在组件中使用vuex的dispatch和commit的时候,我们只要把action.mutati ...

  7. 使用base标签后图片无法加载_Spring 源码学习(二)-默认标签解析

    `Spring` 解析默认标签~ 从上一篇笔记可以看出,在容器注册 bean 信息的时候,做了很多解析操作,而 xml 文件中包含了很多标签.属性,例如 bean . import 标签, meta ...

  8. java spring ioc 实例_Spring 源码阅读(IOC容器)-bean的实例化以及注入

    3.Bean的实例化以及注入过程分析 Bean的实例以及注入是在getBean时触发的,由于外部容器是与外部调用交互的桥梁,我们首先从外部容器入手,AbstractApplicationContext ...

  9. DBFace: 源码阅读(二)

    上篇链接 看LZ上篇博客的时间竟然是7月18日,着实是懈怠了,其实有很多东西需要总结归纳,这周末就补一下之前欠的债吧 上篇主要介绍了DBFace的大体框架,这篇主要介绍数据的预处理部分 5. 数据预处 ...

最新文章

  1. sys.check_constraints
  2. go 清空文件内容_玩转Go单元测试,你只需要掌握这5点
  3. Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架
  4. Spring事件机制Event源码解析(未完待续)
  5. edpluse怎么运行c语言,[JSP]小菜也来学Editplus+Tomcat配置jsp运行环境
  6. SpringMVC框架----请求参数的绑定
  7. 神奇的go语言(image网站开发)
  8. Linux iptables 防火墙常用规则
  9. log4j 打印线程号配置_Log4J日志整合及配置详解
  10. 后端开发都应该掌握的Redis基础
  11. 【风速预测】基于matlab EMD+模拟退火算法优化DBN风速预测【含Matlab源码 JQ003期】
  12. java 接收soap_2.技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化...
  13. 分享个最终幻想勇气启示录脚本,手游上能一键推图自动升级
  14. linux多人共享桌面,gnome 开远程桌面共享功能(linux启动多个桌面)
  15. linux英英词典项目,五大主流英英词典(ESL)比较使用测评报告
  16. 手机里tencent文件夹能删吗_华为手机中的文件夹代表什么,哪些可以删除,看完秒懂-tencent是什么文件夹...
  17. S=A-BIS-dS+u2w2I+u1w1E数模作业
  18. HLS流媒体服务器对性能要求,搭建hls直播流媒体服务器有什么要求?
  19. 小米与vivo相争,高通成为最大受益者
  20. 【Java中继承总结与练习 】

热门文章

  1. vue-cli3+cordova实现app混合开发
  2. XCode6 ,iOS之PCH文件配置
  3. 坑爹系列:sizeof运算符
  4. IOS创建静态库Cocoa Touch Static Library
  5. web工程本地跟tomcat部署导致根路径不一致问题
  6. Guacamole-HTML5无客户端远程桌面
  7. biztalk 2006 产品的版本以及适配器相关信息
  8. 怎样设置HTML上传控件,上传文件的大小
  9. launch edge 和 latch edge 延迟以及静态时序分析相关概念
  10. 不光是查找值!二分搜索