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)

大家都在看

  • Hadoop的由来、Block切分、进程详解

    Hadoop的由来、Block切分、进程详解 一、hadoop的由来 Google发布了三篇论文: GFS(Google File System) MapReduce(数据计算方法…

    技术杂谈 2023年7月11日
    062
  • Mac安装Flutter

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:个人独立开发者➤博主域名:https://www.zengqiang.org➤Git…

    技术杂谈 2023年6月1日
    085
  • 【软考】信息系统安全技术

    《信息安全等级保护管理办法》中5个等级的区别 对于公民、法人和其他组织的合法权益没有 特别严重损害的说法 作者:奔跑的金鱼 出处:https://www.cnblogs.com/O…

    技术杂谈 2023年5月31日
    085
  • Java-Lambda

    学习Lambda的理由 为了了解Lambda表达式,我们必须了解什么是函数式接口,这是Lambda表达式得以实现的依据。 在java中,函数式接口指 注解了@FunctionalI…

    技术杂谈 2023年7月11日
    062
  • 2019Hexo博客Next主题深度美化 打造一个炫酷博客(2)-奥怪的小栈

    219/8/1 更新本文转载于:奥怪的小栈 这篇文章告诉你在搭建好博客后,面对网上千篇一律的美化教程怎么才能添加自己独特点,使人眼前一亮. 本站基于HEXO+Github搭建。所以…

    技术杂谈 2023年6月21日
    084
  • chrome 浏览器的使用技巧

    前端工程师大部分工作成果需要在浏览器中查看,使用 chrome 浏览器的频率非常高。更好更优雅地使用 chrome,将 chrome 配置成趁手的浏览器,将极大提升编程效率。本文将…

    技术杂谈 2023年5月30日
    073
  • 可视化工具 grafana 安装

    docker安装 Grafana是开源的、炫酷的可视化监控、分析利器,无论您的数据在哪里,或者它所处的数据库是什么类型,您都可以将它与Grafana精美地结合在一起。它还有丰富的套…

    技术杂谈 2023年5月31日
    0102
  • crudapi增删改查接口零代码产品成功案例之金茶王投票系统

    crudapi增删改查接口零代码产品成功案例之金茶王投票系统 简介 2020年由于疫情原因,金茶王投票活动改成线上云投票,所以需要一套投票系统进行比赛。参赛选手包括两种类型,分别为…

    技术杂谈 2023年7月24日
    055
  • gin protobuf客户端测试

    gin protobuf客户端测试 gin protobuf客户端测试 // clientGIN project main.go package main import ( &qu…

    技术杂谈 2023年5月30日
    072
  • 设计模式-模板方法模式

    简述 提取算法中 不变的部分封装成方法, 变化的部分 延迟到子类。 延迟到子类这个说法在学习设计模式的时候经常出现,实际就是利用多态在子类中重写方法,使得实行时根据实例的类型调用不…

    技术杂谈 2023年7月11日
    052
  • K8s-二进制安装

    K8S-二进制安装使用 1.IP总规划 服务类型 ip地址 组件 k8s-master01 etcd集群节点1 192.168.80.20 kube-apiserver、kube-…

    技术杂谈 2023年7月11日
    068
  • 谈服务可用性监控

    一个服务的监控从整体考虑,要达到哪些才能算是完善的?我想,如果没有一个全局性的监控思考,一个服务的监控即使加的再多也是会有监控盲区的。 从基础机器到上层业务,分为三个不同层次:系统…

    技术杂谈 2023年6月1日
    082
  • UE4 Keynote 1

    【 UE4 Keynote 1】 1、U3D中的Project,在UE4中叫 ContentBrowser,中文名叫”内容浏览器” 最多可以打开4个Cont…

    技术杂谈 2023年5月31日
    084
  • 前端笔记知识

    笔记列表 基础知识 语言基础 DOM 计算机原理 CSS3 Git 网络与安全 网络 安全 性能与兼容性 数学 规范与概念 数据结构与算法 数据结构 算法 from: http:/…

    技术杂谈 2023年5月31日
    084
  • 云原生可观测性追踪技术

    百度工程师眼中的云原生可观测性追踪技术 https://mp.weixin.qq.com/s/FyPaifHGs3knCcHmjMGVqg 收录于合集 技术加油站21 个 程序员1…

    技术杂谈 2023年5月31日
    0103
  • STM32 例程-7 STM32固件库方式 读取SHT20 温湿度

    SHT20 .h文件 #ifndef SHT20_H #define SHT20_H #include "common.h" #include "st…

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