首页 > 其他分享 >IoC容器

IoC容器

时间:2023-12-19 10:35:32浏览次数:19  
标签:容器 变量 获取 实例 IoC Class 加载

一、设计

image.png
框架最基本功能:

  1. 解析配置
  2. 定位与注册对象
  3. 注入对象
  4. 提供通用工具类

二、IoC容器的实现

需要实现的点:

  1. 创建注解
  2. 提取标记对象
  3. 实现容器
  4. 依赖注入

2、提取标记对象

  1. 指定范围,获取范围内的所有类
  2. 遍历所有类,获取被注解标记的类并加载进容器里

**extractPacakgeClass**里面需要完成的事情:

  1. 获取到类的加载器
  2. 通过类加载器获取到加载的资源信息
  3. 依据不同的资源类型,采用不容的方式获取资源的集合

为什么不让用户传入绝对路径:

  1. 不够友好:不同机器之间的路径肯跟不相同
  2. 如果打的是war包或者jar包,根本找不到路径
  3. 因此通用的做法是通过项目的类加载器来获取

2.1、类加载器ClassLoader

  • 根据一个指定的类的名称,找到获取生成其对应的字节码
  • 加载Java应用所需的资源

image.png
获取类加载器的方法:

Thread.currentThread().getContextClassLoader();

统一资源定位符URL:
某个资源的唯一地址

  • 通过获取java.net.URL实例获取协议名、资源名、路径等信息

image.png

三、单例模式 Singleton Pattern

确保一个类只有一个实例,并对外提供统一访问方式

  • 饿汉模式:类被加载的时候就立即初始化并创建唯一实例
  • 懒汉模式:在被客户端首次调用的时候才会创建唯一实例
    • 加入双重检查锁机制的懒汉模式能够确保线程安全
  • 装备了枚举的饿汉模式能够抵御反射与序列化的进攻,满足容器需求

1、枚举保证无视反射和序列化攻击的单例

枚举也是饿汉模式
image.png
问题:
枚举如何抵挡序列化和反序列化攻击?
线索:ObjectInputStream的readObject源码

四、容器的载体及容器的加载

1、获取单例Bean实例

image.png

2、实现容器

2.1、容器的组成部分

  • 保存Class对象及其实例的载体
  • 容器的加载
  • 容器的操作方式

2.2、实现容器的加载

  • 配置的管理与获取
  • 获取指定范围内的Class对象
  • 依据配置提取Class对象,连同实例一并存入容器

2.3、实现容器的操作方式

涉及到容器的增删改查

  • 增加、删除操作
  • 根据Class获取对应实例
  • 获取所有Class和实例
  • 通过注解来获取被注解标注的Class
  • 通过超类获取对应的子类Class
  • 获取容器载体保存的Class的数量

2.4、作用域

  • singleton
  • prototype
  • request
  • session
  • globalsession

3、实现容器的依赖注入

目前容器里面管理的Bean实例仍可能是不完备的

  • 实例里面某些必须的成员变量还没有创建出来

实现思路:

  1. 定影相关的注解标签
  2. 实现创建被标注的成员变量实例,并将其注入到成员变量里
  3. 依赖注入的使用

doIoc():

  1. 遍历Bean容器中所有的Class对象
  2. 遍历Class兑现所有的成员变量
  3. 找出被Autowired标记的成员变量
  4. 获取这些成员变量类型
  5. 获取这些成员变量的类型在容器里对应的实例
  6. 通过反射将对应的成员变量实例注入到成员变量所在类的实例里

标签:容器,变量,获取,实例,IoC,Class,加载
From: https://www.cnblogs.com/meidanlong/p/17913114.html

相关文章

  • IoC源码
    主心骨:解析配置定位与注册对象注入对象一、Bean与BeanDefinition1、全局掌握核心接口和类解决了关键问题:将对象之间的关系转而用配置来管理依赖注入:依赖关系在Spring的IoC容器中管理通过把对象包装在Bean中以达到管理对象和进行额外操作的目的Bean是Spring的一等公......
  • Servlet容器中先执行Filter后执行Servlet是怎么实现的
     org.apache.catalina.core.ApplicationFilterChain#internalDoFilter filter.doFilter(request,response,this);this是ApplicationFilterChain  增加一个Filter,则Filters总数n增加1org.apache.catalina.core.ApplicationFilterChain#addFilter ......
  • docker容器自动重启命令
    在服务器意外断电或者重启的情况下,docker服务是关闭的一个状态,每次断电或者重启都要使用命令手动重启服务,但是每次都要手动命令重启,比较麻烦,因此根据要求设置docker服务自动重启。1、设置docker容器进行开机自动重启我们可以使用以下命令进行设置docker容器自动重启#docker服务设置......
  • istioctl 部署 istio
    istio架构:1、下载istio安装包[root@master1~]#curl-Lhttps://istio.io/downloadIstio|ISTIO_VERSION=1.8.2TARGET_ARCH=x86_64sh-2、移动istioctl到/usr/bin目录下[root@master1~]#cpistio-1.8.2/bin/istioctl/usr/bin3、查看istio可用配置列表[root@master1......
  • SpringIOC和AOP机制的学习
    SpringIOC和AOP机制的学习5、HelloSpring_哔哩哔哩_bilibilispringIOC依赖code-block直接导入mvc依赖也可以<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><......
  • 亚洲唯一,阿里云入选 Gartner® 容器管理领导者象限!
    日前,权威市场研究机构Gartner公布了最新的《2023年度容器管理魔力象限》(MagicQuadrant™forContainerManagement,September2023),为全球企业的容器产品选型提供专业指导。凭借国内第一的综合实力,阿里云首次进入该报告的领导者象限,也是亚洲地区唯一入选该象限的云服务......
  • K8s - 容器编排引擎Kubernetes
     什么是Kubernetes?背景Kubernetes是开源的容器集群管理项目,诞生于2014年,由Google公司发起前身Borg系统在Google内部应用了十几年,积累了大量来自生产环境的实践经验试图为基于容器的应用部署和管理打造一套强大并且易用的管理平台该项目基于Go语言实现介绍一个基于容......
  • 最新Spring 6手写实现Sping IOC保姆级教程
    Java全能学习+面试指南:https://javaxiaobear.cn我们都知道,Spring框架的IOC是基于Java反射机制实现的,下面我们先回顾一下java反射。1、回顾Java反射Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种......
  • DOCKER20231217: 容器引擎Docker
       1.1Docker简介 1.1.1什么是Docker?一种轻量级的操作系统虚拟化技术,基于Go语言实现的开源容器项目,诞生于2013年,最初发起者是dotCloud公司(现DockerInc)Docker容器化虚拟技术vs传统虚拟机技术特性容器虚拟机启动秒级分钟级硬盘使用一般为MB一般为G......
  • DependencyInjection组件实现IOC控制反转(2)
    目的:讲解DependencyInjection组件实现IOC的步骤1、添加Nuget包:Micosoft.Extensions.DependencyInjection2、创建容器://创建容器ServiceCollectionservices=newServiceCollection(); 3、注册:把服务注册进容器的过程  有两个概念需要说明下:     服务类......