IOC容器模拟实现

运用反射机制和自定义注解模拟实现IOC容器,使其具有自动加载、自动装配和根据全限定类名获取Bean的功能。

1-1 IOC容器的本质

IOC容器可理解为是一个map,其中的一个entry可理解为一个component(组件),entry中的key为beanId(全限定类名),entry中的value为bean(类对应的对象);

具体的体现为:

1-2 自动加载

  • 自动加载是指IOC容器会自动加载被@Component等(以下用@Component为例)注解标记的类,使其成为IOC容器中的一个组件;
  • @Component注解加在一个类前,表示此类被IOC容器管理,成为IOC容器中的一个组件;
  • 在自动加载时,容器会自动扫描给定包路径所对应的包及其子包下的所有类,判断类是否是接口,如果不是接口就再判断是否被@Component标记,如果被标记了就将其添加到IOC容器中,key为该类的全限定类名,value为该类的对象。具体流程如图:

1-3 自动装配

  • 自动装配是指IOC容器会自动装配容器中各个bean中被@Autowired注解标记属性的属性值;
  • @Autowired注解加在类中的一个属性前,表示此属性的值需要被自动装配;
  • 待自动加载完成后,容器会根据keySet中的全限定类名遍历容器中各个类的各个属性,判断属性是否被@Autowired注解标记,如果被标记了,就会根据属性的类型的全限定类名(beanId)从容器中找到对应的bean,然后将找到的bean 的引用赋值给对应属性(模拟bean的scope为singleton)。具体的流程如图:

2-1 模拟情形

IOC容器自动加载 com.hutao.springioc包及其子包下的所有类,并自动完成各类对应bean的属性装配。

2-2 目录结构

  • Autowired, Component为自定义注解;
  • Cat, Dog, User为实体类;
  • IocContainer为IOC容器;
  • Demo为测试。

2-3 实现

Autowired.java

Component.java

Cat.java

Dog.java

User.java

IocContainer.java

Demo.class

测试结果为:

注意:
1. 以上IOC容器的实现原理只是基本的原理,甚至未查看源码进行验证,仅用于初步理解;

Original: https://www.cnblogs.com/certainTao/p/14028608.html
Author: certainTao
Title: IOC容器模拟实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/712445/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • PyQt5 QToolButton

    ################################ PyQt5中文网 – PyQt5全套视频教程 # https://www.PyQt5.cn/ # 主讲: 村长 #…

    技术杂谈 2023年5月31日
    0102
  • cookie、session和token理解

    1. cookie Cookie是浏览器在电脑本地保存数据的一种机制,浏览器通过cookie这种机制可以在浏览器上保存用户在浏览器上浏览过的商品,或者在浏览器通过cookie记录一…

    技术杂谈 2023年6月21日
    0100
  • -source 1.5 中不支持 diamond 运算符

    maven编译时报”-source 1.5 中不支持 diamond 运算符”错误 D:\maven3.5.3\conf\settings.xml ————…

    技术杂谈 2023年5月31日
    083
  • 完全二叉树结点数

    完全二叉树结点数 问题描述 给你一棵完全二叉树的根节点 root ,求出该树的节点个数。 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大…

    技术杂谈 2023年7月25日
    091
  • 定时任务日志traceid

    在使用xxl-job框架作为项目中的定时任务管理时,JobHandler线程记录日志时没有traceId,导致查询日志时不方便。其他框架如SpringMVC、Dubbo等都提供了拦…

    技术杂谈 2023年6月1日
    086
  • Pycharm k火秘诀插件

    Pycharm2020最新永久激活码插件(支持Windows),100%永久激活 用到pycharm工具发现没用多久时间又过期了,在网上有看到很多朋友都遇到同样的情况,于是找到了一…

    技术杂谈 2023年6月21日
    0165
  • Oracle VM VirtualBox 导入vdi

    Oracle VM VirtualBox 导入别人制做好的研发系统,或者换电脑后,不想重做系统导入原来制作好的系统,这里就能用到导入vdi文件 1.点击新建按钮(快键键:Ctrl+…

    技术杂谈 2023年6月1日
    096
  • 超详细的SpringBoot框架入门教程

    Spring Boot 框架快速入门教程以大量示例讲解了 Spring Boot 在各类情境中的应用,让大家可以跟着老师的思维和代码快速理解并掌握。适用于 Java 开发人员,尤其…

    技术杂谈 2023年7月25日
    082
  • DTSE Tech Talk丨第2期:1小时深度解读SaaS应用系统设计

    摘要:介绍在SaaS场景下如何技术选型,SaaS架构设计中关键的技术点等内容。 本文分享自华为云社区《DTSE Tech Talk丨第2期:1小时深度解读SaaS应用系统设计》,作…

    技术杂谈 2023年5月31日
    0130
  • Vue中预览HIKVSION海康威视摄像头时ip不通浏览器卡死问题解决

    场景 SpringBoot+Vue+HIKVSION实现摄像头多选并多窗口预览(插件版): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/ar…

    技术杂谈 2023年5月31日
    0151
  • Mysql 事务(标贝科技)

    @ 事务 InnoDB对ACID的支持 隔离级别 + 不同隔离级别下读读取数据可能出现的情况 不可重复读和幻读区别 redo log (共享表空间) redo log block …

    技术杂谈 2023年7月25日
    0119
  • Saltstack系列4:Saltstack之Grains组件

    grains说明 grains是Saltstack最重要的组件之一,grains的作用是手机被控主机的基本信息,这些信息通常都是一些静态类的数据,包括CPU、内核、操作系统、虚拟化…

    技术杂谈 2023年5月31日
    095
  • 标识符和关键字

    标识符 标识符是什么? 关键字 为编程文件取名时不能使用图中的关键字,否则会直接报错,根本没法儿写后续内容 Java的所有组成部分都需要名字。类名,变量名以及方法名都被称为标识符 …

    技术杂谈 2023年6月21日
    091
  • 十九、网络编程

    十九、🔴网络编程 19.1 网络编程 19.1.1 软件架构 C/S 结构 :全称为 Client/Server 结构,是指客户端和服务器结构。常见程序有 Q…

    技术杂谈 2023年7月11日
    0101
  • .net自动摘要等算法HanLP.net

    参考资料: 在CSharp中调用HanLP 目前自动摘要算法似乎没有.net 版本,而以java,python 居多 自动摘要算法一般使用textrank算法 比如java开源的:…

    技术杂谈 2023年7月24日
    0123
  • 【源码笔记】ThreadPoolExecutor#getTask

    /** * Performs blocking or timed wait for a task, depending on * current configuration set…

    技术杂谈 2023年7月24日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球