当前位置: 首页 > news >正文

Spring6学习技术|IoC|手写IoC

学习材料

尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)

有关反射的知识回顾

IoC是基于反射机制实现的。

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。

要想解剖一个类,必须先要获取到该类的Class对象。而剖析一个类或用反射解决具体的问题就是使用相关API(1)java.lang.Class(2)java.lang.reflect,所以,Class对象是反射的根源

具体要掌握的操作就是如何获取class(三种方法),如何获取构造器及创建对象,如何获取属性,如何获取方法并执行。(这里注意public和private的不同操作)。

package com.zy.reflect;import org.testng.annotations.Test;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;public class TestCar {@Testpublic void test01() throws Exception {//获取class的方法
//        Car car = new Car();
//        Class clazz1 = car.getClass();Class clazz2 = Car.class;Class clazz3 = Class.forName("com.zy.reflect.Car");Constructor[] constructors = clazz3.getDeclaredConstructors();for(Constructor con:constructors){if(con.getParameterCount()==3){con.setAccessible(true);Car car = (Car) con.newInstance("奔驰", 1, "黑色");
//                System.out.println(car);}}//或者直接获取Constructor c2 = clazz3.getDeclaredConstructor(String.class, Integer.class, String.class);c2.setAccessible(true);Car car2 = (Car)c2.newInstance("捷达", 15, "白色");System.out.println(car2);}@Testpublic void test02() throws Exception {Class clazz3 = Class.forName("com.zy.reflect.Car");Car car = (Car)clazz3.getConstructor().newInstance();Field[] fields = clazz3.getDeclaredFields();for (Field field:fields) {if(field.getName().equals("name")) {//设置允许访问field.setAccessible(true);field.set(car,"五菱宏光");//这里需要有对应的对象。System.out.println(car);}System.out.println(field.getName());}}@Testpublic void test03() throws Exception {Class clazz3 = Class.forName("com.zy.reflect.Car");Car car = (Car)clazz3.getConstructor().newInstance();Method[] methods = clazz3.getDeclaredMethods();for (Method method:methods) {//执行方法 toStringif(method.getName().equals("toString")) {String invoke = (String)method.invoke(car);System.out.println("toString执行了:"+invoke);}if(method.getName().equals("run")) {//设置允许访问method.setAccessible(true);method.invoke(car);//这里需要有对应的对象。System.out.println(car);}}}
}

手写IoC

实现的思路设计
在这里插入图片描述
环境框架
在这里插入图片描述

第一二步手打过很多次了,没什么难度。
第三步:
创建Annotation文件,与接口之类的类似。不同在于有元注解需要考虑(注解面向的范围)Bean是创建类,Di注入

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Bean {
}@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Di {
}

第四步:要了解这一步要干嘛,需要从需求出发。
需求如下:即输入一个com.zy。我要组织得到一个Map集合,创建好所有标注注解Bean的类,与Di注入。getBean用于利用class信息返回Map内的元素。

public class TestUser {public static void main(String[] args) {ApplicationContext context = new AnnotationApplicationContext("com.zy");UserService bean = (UserService)context.getBean(UserService.class);bean.add();}
}

如何实现创建Map(主要学习的是如何遍历文件,如何扫描注解)

private Map<Class, Object> beanFactory = new HashMap<>();private static String rootPath;@Overridepublic Object getBean(Class clazz) {return beanFactory.get(clazz);}
public AnnotationApplicationContext(String basePackage) {//如何根据包的路径,设置扫描规则try {String packageDirName = basePackage.replaceAll("\\.", "\\\\");Enumeration<URL> dirs =Thread.currentThread().getContextClassLoader().getResources(packageDirName);while (dirs.hasMoreElements()) {URL url = dirs.nextElement();String filePath = URLDecoder.decode(url.getFile(),"utf-8");
//                System.out.println(filePath);//包扫描rootPath = filePath.substring(0, filePath.length()-packageDirName.length());loadBean(new File(filePath));}} catch (Exception e) {throw new RuntimeException(e);}//属性注入loadDi();}private void loadBean(File file) throws Exception {//1.当前FIle是否是文件夹if (file.isDirectory()){//2.是文件夹的话,获取所有内容File[] childrenFiles = file.listFiles();//3.判断内容是否为空if (childrenFiles == null || childrenFiles.length==0){return;}//4.遍历所有内容for (File child:childrenFiles){//1.还是文件夹就递归if (child.isDirectory()){loadBean(child);}else {//是文件,获取完整的类路径String pathWithClass = child.getAbsolutePath().substring(rootPath.length()-1);//是不是class文件if (pathWithClass.contains(".class")){String allName = pathWithClass.replaceAll("\\\\", "\\.").replace(".class", "");//判断类中有没有@Bean注解Class<?> clazz = Class.forName(allName);if (!clazz.isInterface()){Bean annotation = (Bean)clazz.getAnnotation(Bean.class);if (annotation!=null){Object instance = clazz.getConstructor().newInstance();if (clazz.getInterfaces().length>0){beanFactory.put(clazz.getInterfaces()[0], instance);}else{beanFactory.put(clazz, instance);}}}}}}}}private void loadDi(){//实例化对象在beanFactory的map//1 遍历beanFactory的mapSet<Map.Entry<Class, Object>> entries = beanFactory.entrySet();for(Map.Entry<Class, Object> entry:entries){//2 获取map的每个对象value,每个对象属性获取到Object obj = entry.getValue();Class clazz = obj.getClass();Field[] fields = clazz.getDeclaredFields();//3 遍历得到每个对象属性数组,得到每个属性for(Field field:fields){//4 判断属性上面是都有@Di注解Di annotation = field.getAnnotation(Di.class);//5 如果有@Di注解,把对象进行设置(注入)if (annotation!=null){field.setAccessible(true);//这一步什么??filed这个属性的类型field.getType() beanFactory.get()得到对应的对象。try {field.set(obj, beanFactory.get(field.getType()));} catch (IllegalAccessException e) {throw new RuntimeException(e);}}}}

相关文章:

Spring6学习技术|IoC|手写IoC

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; 有关反射的知识回顾 IoC是基于反射机制实现的。 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&…...

基于Java在线宠物店商城系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…...

http和https的区别(简述)

HTTP&#xff08;HyperText Transfer Protocol&#xff09;和HTTPS&#xff08;HTTP Secure&#xff09;都是用于在客户端和服务器之间传输数据的协议&#xff0c;但它们在安全性方面有重要的区别。 1.HTTP: 概述&#xff1a; HTTP是一种用于传输超文本的协议&#xff08;超文…...

2024年【T电梯修理】找解析及T电梯修理复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 T电梯修理找解析是安全生产模拟考试一点通总题库中生成的一套T电梯修理复审考试&#xff0c;安全生产模拟考试一点通上T电梯修理作业手机同步练习。2024年【T电梯修理】找解析及T电梯修理复审考试 1、【多选题】操纵箱…...

【计算机网络】socket 网络套接字

网络套接字 一、端口号1. 认识端口号2. socket 二、认识TCP协议和UDP协议1. TCP协议2. UDP协议 三、网络字节序四、socket 编程1. socket 常见API2. sockaddr 结构3. 编写 UDP 服务器&#xff08;1&#xff09;socket()&#xff08;2&#xff09;bind()&#xff08;3&#xff0…...

Eclipse的Java Project的入口main函数

在使用Eclipse创建java project项目的时候&#xff0c;一个项目里面通常只有一个main&#xff0c;那么一个项目里面是否可以有多个main函数呢&#xff1f;其实可以的&#xff0c;但是运行java application的时候要选择执行哪个main函数。 下面举个例子&#xff1a; 1、创建一个…...

JVM内存分析工具-Arthas 教程[详细]

一、概述 Arthas&#xff08;阿尔萨斯&#xff09;是阿里巴巴开源的一款Java诊断工具&#xff0c;用于实时检测、诊断Java应用程序的性能问题。它是一个命令行工具&#xff0c;提供了丰富的功能&#xff0c;包括查看类加载信息、方法执行耗时、线程堆栈、内存分析等。Arthas 的…...

Google发布开放的模型Gemma

今天&#xff0c;Google 发布了一系列最新的开放式大型语言模型 —— Gemma&#xff01;Google 正在加强其对开源人工智能的支持&#xff0c;我们也非常有幸能够帮助全力支持这次发布&#xff0c;并与 Hugging Face 生态完美集成。 Gemma 提供两种规模的模型&#xff1a; 7B …...

谷歌掀桌子!开源Gemma:可商用,性能超过Llama 2!

2月22日&#xff0c;谷歌在官网宣布&#xff0c;开源大语言模型Gemma。 Gemma与谷歌最新发布的Gemini 使用了同一架构&#xff0c;有20亿、70亿两种参数&#xff0c;每种参数都有预训练和指令调优两个版本。 根据谷歌公布的测试显示&#xff0c;在MMLU、BBH、GSM8K等主流测试…...

http缓存?强制缓存和协商缓存?

HTTP缓存是一种优化网络资源加载速度的技术&#xff0c;通过减少从服务器获取相同资源的次数来实现。HTTP缓存机制包括强制缓存和协商缓存&#xff08;对比缓存&#xff09;两种类型。 强制缓存 强制缓存是指浏览器在接收到服务器返回的响应后&#xff0c;会将响应内容和相关…...

技术心得--如何成为优秀的架构师

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/技术辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…...

【Unity】【VR开发】Unity云同步功能使用心得

【背景】 有时出差,旅行等等也带着电脑,晚上想要继续编辑项目,就需要用到云同步功能。目前实践下来,发现有些内容可以同步,有些内容则是不可以同步的,总结如下。 【如何云同步一个本地项目】 UnityHub的项目面板中有两个选项卡:项目和云端项目。 鼠标挪动到想要云同步…...

vscode侧边框关掉了怎么打开

View - Appearance - Secondary Side Bar 就可以显示出来了&#xff0c;例如 &#xff1a;&#xff08;CodeGeeX不显示主界面&#xff09;...

YOLO-NAS浅析

YOLO-NAS&#xff08;You Only Look Once - Neural Architecture Search&#xff09;是一种基于YOLO&#xff08;You Only Look Once&#xff09;的目标检测算法&#xff0c;结合神经架构搜索&#xff08;NAS&#xff09;技术来优化模型性能。 YOLO是一种实时目标检测算法&…...

LeetCode 2656.K个元素的最大和

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次&#xff0c;最大化你的得分&#xff1a; 从 nums 中选择一个元素 m 。 将选中的元素 m 从数组中删除。 将新元素 m 1 添加到数组中。 你的得分增加 m 。 请你返回执行以上操作恰好 k 次后…...

【最新Dubbo3深入理解】Dubbo3核心Tripple协议详解

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…...

神秘人暗访:行政窗口为什么要开展神秘顾客调研

在竞争日益激烈的服务市场中&#xff0c;行政窗口作为公共服务的直接提供者&#xff0c;其服务质量的好坏直接关系到政府的形象和公众对政府的信任度。为了更好地满足市民的需求&#xff0c;提升服务质量&#xff0c;开展神秘顾客调查显得尤为重要。神秘顾客调查的必要性包括以…...

Spring之AOP

文章目录 初步实现通知执行顺序 各个通知获取细节信息重用切点表达式切点表达式语法细节环绕增强切面的优先级没有接口的情况基于XML的AOP[了解] 初步实现 先导入Spring和Junit4的依赖 <dependency><groupId>org.springframework</groupId><artifactId&g…...

Git详解及 github与gitlab使用

目录 1.1 关于版本控制 1.1.1 本地版本控制 1.1.2 集中化的版本控制系统 1.1.3 分布式版本控制系统 1.2 Git简介 1.2.1 Git历史 1.3 安装git 1.3.1 环境说明 1.3.2 Yum安装Git 1.3.3 编译安装 1.4 初次运行 Git 前的配置 1.4.1 配置git 1.4.2 获取帮助 1.5 获取 G…...

政安晨:【完全零基础】认知人工智能(二)【超级简单】的【机器学习神经网络】—— 底层算法

如果小伙伴第一次看到这篇文章&#xff0c;可以先浏览一下我这个系列的上一篇文章&#xff1a; 政安晨&#xff1a;【完全零基础】认知人工智能&#xff08;一&#xff09;【超级简单】的【机器学习神经网络】 —— 预测机https://blog.csdn.net/snowdenkeke/article/details/…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...