(反射+内省机制的运用)简单模拟spring IoC容器的操作

Spring:IOC与AOP 目录一、Spring简介1、Spring2.spring优势​编辑二、IOC1.概念和原理 2.自定义IOC容器1.需求2.实现3.Spring相关的API3.1 图解​编辑 3.2.BeanFactory 接口4、Spring相关配置文件和操作4.1 Bean标签基本配置4.2 Bean标签配置范围4.3 Bean生命周期配置4.4 Bean实例化三种方式4.5 无参构造方法实例化4.6 工厂静态方法实例化4.7 工厂普通方法实例化4.8 Bean依赖注入概述4.9 有参构造方法注入(一个是userdao 阅读详情

简单模拟spring IoC容器的操作【管理对象的创建、管理对象的依赖关系,例如属性设置】

实体类Hello

package com.shan.hello;
public class Hello {
private String password;
private String username;

private Hello() {};

public Hello(String username) {
this.username = username;
}


public void setPassword(String password) {
this.password = password;
}

public void setUsername(String username) {
this.username = username;
}

public void printUser() {
System.out.println("hello " + username + ", your password is " + password);
}
}

1、实例Hello对象-反射常用的方法,调用Class类中的newInstance();

但是SpringIoC容器中必须存在一个和访问权限无关的无参构造器(例如Hello中的构造器可以是public,也可以是private)

实体类Hello

public class Hello {
private String password;
private String username;
private Hello() {};//bean 类必须存在一个无参数构造器(且该无参构造器和访问权限无关);

所以不是直接通过Class类的newInstance方法,​而是先通过反射构建构造器Constructor,然后通过调用构造器Constructor的newInstance方法创建实例对象Hello​​

String className = "com.shan.hello.Hello";
Hello hello = null;
//================================
//实例Hello对象-反射常用的方法,调用Class类中的newInstance();
// Object obj = Class.forName(className).newInstance();//因为通过测试得知实体必须存在一个(与访问性无关的)构造器,
//所以不是直接通过Class类的newInstance方法,而是先通过反射构建构造器Constructor,然后通过调用构造器Constructor的newInstance方法创建实例对象
//反射机制获取构造器
Class clazz = Class.forName(className);
Constructor con = clazz.getDeclaredConstructor();
con.setAccessible(true);//设置构造器的可访问性
Object obj = con.newInstance();
hello = (Hello)obj;

2、✿ Spring 管理bean的原理:

① 通过 Resource 对象加载配置文件

② 解析配置文件,得到指定名称的 bean

③ 解析 bean 元素,id 作为 bean 的名字,class 用于反射得到 bean 的实例

注意:此时,bean 类必须存在一个​​无参数构造器​​(且该无参数构造器​​和访问权限无关​​);

④ 调用 getBean 方法的时候,从容器中返回对象实例;

■ 结论:就是把代码重写 JAVA 文件中转移到了 XML 中。(即是将咱模拟的IoC容器代码的过程转移到xml文件中)

3、完整模拟IoC容器代码如下:

登录后复制
/* 实体类Hello */
public class Hello {
private String password;
private String username;
private Hello() {};//bean 类必须存在一个无参数构造器`(且该无参数构造器和访问权限无关);可以是public,也可以是private
public void setPassword(String password) {
this.password = password;
}
public void setUsername(String username) {
this.username = username;
}
public void printUser() {
System.out.println("hello " + username + ", your password is " + password);
}
}
/* 测试类 */
//简单模拟spring IoC容器的操作【管理对象的创建、管理对象的依赖关系,例如属性设置】
@Test
void testIoCMock() throws Exception {
String className = "com.shan.hello.Hello";
Hello hello = null;
//================================
//实例Hello对象-反射常用的方法,调用Class类中的newInstance();
// Object obj = Class.forName(className).newInstance();//因为通过测试得知实体必须存在一个(与访问性无关的)构造器,
//所以不是直接通过Class类的newInstance方法,而是先通过反射构建构造器Constructor,然后通过调用构造器Constructor的newInstance方法创建实例对象
//反射机制获取构造器
Class clazz = Class.forName(className);
Constructor con = clazz.getDeclaredConstructor();
con.setAccessible(true);//设置构造器的可访问性
Object obj = con.newInstance();
hello = (Hello)obj;
//内省机制操作javaBean属性
BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
//当前的属性的属性名
String propertyName = pd.getName();
if("username".equals(propertyName)) {
pd.getWriteMethod().invoke(hello,"shan");
}else if("password".equals(propertyName)) {
pd.getWriteMethod().invoke(hello, "123");
}
}
hello.printUser();
}
Java反射机制在Spring IOC中的应用 IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 本篇文章主要讲解一下IOC底层实现的原理(反射),就不对IOC的概念进行详述了。 在Spring的配置文件中,经常看到如下配置: 那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器中去了了?对,就是通过反射!!! 下面是Spring通过 阅读详情

相关推荐

使用反射和注解模拟Spring的依赖注入

NULL 博文链接:https://zmx.iteye.com/blog/688299

利用反射加工厂模式简单实现一个Spring IOC容器

Sping IOC 容器,反射,工厂模式

weixin_47301645的博客 403

模拟Spring的IOC

NULL 博文链接:https://lgd-java2eye.iteye.com/blog/759878

模拟实现 Spring IOC(详解)

模拟实现 Spring IOC(详解)

SwaggerHB的博客 667

模拟实现Spring的IOC

模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map beans = new HashMap(); 2、本工程,模拟实现Spring的IOC,将xml中配置的Bean读入到Spring容器中,并在测试用例中调用Spring容器中的bean。 3、开发环境eclipse,jdk1.6。使用第三方jar包有:jdom.jar(用于解析xml文件),junit-4.4.jar(用于测试)。

AI嵌入式系统测试:从确定性验证到概率性评估的体系构建

软件测试是保障系统质量的关键环节,其核心在于验证功能是否符合预期。传统嵌入式测试聚焦于确定性逻辑,通过代码覆盖、边界值分析等方法确保时序、内存等指标的精确性。随着人工智能技术的普及,深度学习模型以其概率性输出和复杂非线性映射的特性,为嵌入式系统带来了新的能力,也彻底改变了测试的范式。AI模型的‘黑盒’特性使得测试目标从‘绝对正确’转向‘置信度满足’,并催生了准确率、F1分数等新指标。在工程实践中,这种融合要求测试体系必须扩展维度,将数据质量、模型量化损失、资源约束下的精度与性能权衡纳入核心考量。尤其在嵌入式

weixin_26766559的博客 383

Spring框架之内省

JavaBean规范: 1)JavaBean类必须是一个public的类; 2)JavaBean类必须是有一个空的构造函数; 3)JavaBean的变量应为private; 4)JavaBean的属性通过getter/setter访问; 反射与内省 1)反射可以操作各种类属性,设置属性值可不用调用setter方法; 2)内省是Java提供的一套API,...

jiabaoyu19lindaiyu的博客 1068

汇川AM402、H3U和上位机C#ModebusTcp通讯

目录一、测试任务二、测试环境三、PLC工程1、组态配置2、ip地址、端口号 3、全局变量定义四、C#端Winform程序创建1创建主界面 2、创建子窗口 3、运行生成,界面效果4、Modebus协议说明5、Modebus操作说明六、测试1、寄存器读测试 2、MW1300寄存器的BIT位3、写寄存器测试4、PLC断电或者断网 七、工程下载连接1、PLC作为ModebusTCP端,端口号都是502,PC端上位机软件作为TcpClient去连接多台PLC。PC端读写PLC寄存器。2、PC端在有的PLC断电、断网的

panjinliang066333的博客 2万+

spring 源码阅读(基础)-第二章 基础工具

1.什么是内省:内省是java语言针对bean属性,事件的一种缺省处理方法,spring源码中也经常会出现相关的api。javaBean是一种特殊的类,主要用于信息传递,这种类中的方法主要用于私有字段的访问,且方法名符合某种命名规则,事实上,内省机制也是通过反射来实现的。反射的功能是比内省强大的。在Java内省中,用到的基本上就是上述几个类。内省api的一般的做法是通过类 Introspector 的 getBeanInfo方法来获取某个对象的。

weixin_41636858的博客 325

深度强化学习-D3QN算法原理与代码

Dueling Double Deep Q Network(D3QN)算法结合了Double DQN和Dueling DQN算法的思想,进一步提升了算法的性能。如果对Doubel DQN和Dueling DQN算法还不太了解的话,可以参考我的这两篇博文:深度强化学习-Doubel DQN算法原理与代码和深度强化学习-Dueling DQN算法原理与代码,分别详细讲述了这两个算法的原理以及代码实现。本文就带领大家了解一下D3QN算法,代码链接见下方。 代码:https://github.com/indigo

weixin_46133643的博客 2万+

InfiniteTalk (Wan2.1) 数字人 A800 落地实战:从依赖地狱到完美运行的保姆级指南

摘要:本文详细记录了在A800(80GB)服务器上部署InfiniteTalk开源数字人项目的完整流程。该项目基于阿里Wan2.1视频生成模型,支持无限时长流式生成,但环境配置极其复杂。作者总结了18个关键问题点,包括Python版本冲突、CUDA算子缺失等,并提供了黄金配置方案:使用Python3.10+PyTorch2.5.1环境,精准控制FlashAttention等核心库版本,以及针对A800的显存优化策略。最终实现480P视频30秒/步的生成速度,相比默认配置提升3.7倍性能。

软件工程师文艺 2046

利用Java的反射 手写简易Spring Ioc容器

利用Java的反射 手写简易Spring Ioc容器,快来试试吧!

Wzp20020903的博客 1515

抖音直播参数逆向实战:手把手教你用Python获取ttwid和x-bogus(附完整代码)

本文深入解析抖音直播接口的反爬机制,重点剖析核心防护参数ttwid和x-bogus的生成原理与作用。通过Python实战,手把手教你逆向获取ttwid、webid等关键参数,并构建稳定的数据采集方案,为开发者提供企业级数据获取能力。

weixin_29196891的博客 1045

Spring的IOC容器分析

Spring的IOC从入门到深入

caozhisanguo的专栏 4296

YOLO26改进策略【小目标改进】| 添加专用于小目标的检测层 附YOLOv1~YOLOv11的检测头变化详解

在目标检测领域,小目标检测一直是一个具有挑战性的问题。算法以其高效快速的特点受到广泛关注,然而在面对小目标时,仍存在一些局限性。本文将介绍如何在中添加小目标检测层,以提高对小目标的检测能力。原始模型结构如下: 二、有效特征层对应的检测头类别 2.1 P3/8 - small检测头 原始模型中的对应的检测头主要用于检测相对较小的目标。其特征图大小相对较大,空间分辨率较高。 适合检测尺寸大概在到像素左右的目标。 2.2 P4/16 - medium检测头 这个检测头对应的经过了更多的下采样操作,相比P3/

Limiiiing的博客 355

如何使用Python爬取并保存网页上的所有附件

爬虫(Crawler)是一种自动化程序,它通过模拟人工访问网页并下载网页上的数据或文件,常用于数据采集和分析。爬虫通常以“爬取”的形式自动浏览和提取网页中的各种信息。本文详细介绍了如何使用Python爬取并保存网页中的附件文件,涵盖了网页解析、文件下载、多线程与异步优化等内容。希望通过本文的讲解,能够帮助你理解并掌握附件爬取的技巧。在实际应用中,爬虫开发不仅需要解决技术问题,还要遵守网络道德和法律法规,避免不当使用爬虫造成负面影响。

2201_76125261的博客 968

Spring的IOC容器为什么用反射而不用new来创建实例?

文章目录1. 什么是反射?2. 反射与new的区别2. IOC为什么要使用 工厂 + 反射 创建对象? 1. 什么是反射?        反射是java的一种特性,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 反射的四种创建对象方式 以对象.getClass()的形式获取对象 Person person=

qq_1149513559的博客 5164

彻底解析 DDIC_TYPE_INCONSISTENCY:从 ABAP ST22 连环 Dump 到 SE14 一键修复

听上去像内核级的致命故障,实则更多源于日常运维的细枝末节。只要掌握的排查三板斧,结合严格的变更流程与周期性的字典体检,再严重的 Dump 也能化险为夷。希望本文的案例与步骤能帮助读者在下一次遇到类似问题时,既能快速止血,也能追根溯源,避免重蹈覆辙。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 629

手动模拟IOC容器

引言    最近在看一些关于IOC原理的东西,比较理论,所以还是自己动手模拟一个IOC,这样会对原理理解的更加深一些。    首先我们把我们需要用的dao、service、entity定义出来:    Student.java    public class Student { private int id; private String name; private String a

Jack 架构师之路 1762

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

反射在Spring IOC容器中的应用——动态创建Bean

Spring IOC容器通过反射机制动态创建对象并管理依赖关系。文章以UserService和UserDao为例,详细解析了Spring容器的工作流程:1)解析XML配置文件获取Bean定义;2)使用Class.forName()加载类;3)通过getConstructor()获取构造器;4)利用newInstance()创建对象并注入依赖;5)将对象存入容器。这种反射机制避免了手动new对象,实现了控制反转,是Spring框架的核心特性之一。

ze15829163918的博客 1260

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

IOC容器底层实现原理利用反射

JAVA高级核心机制 反射 掌握反射是每个JAVA程序员必不可缺少的技能 基本上所有的框架底层实现原理都有反射如:不会spring框架都不好意思说自己是搞JAVA的 spring框架; spring框架有三大核心特性: IOC(控制反转) Dl(依赖注入) AOP(面向切面) 举个例子模仿IOCBean创建对象的过程 1.先随便建个文档来当做配置文件里面写入以键值对形式存在的Bean 然后在新建立一个类里面写上实现方法 这个类是什么意思呢 你可以把他理解为工厂动态工厂 用来创建对象的 首先我们肯定

lhj520cb的博客 1787

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

利用反射实现Spring的IOC容器

利用反射实现Spring的IOC容器Spring的IOC简介概念步骤1.首先创建一个简单的pojo2.在xml中配置Book的bean3.在pom.xml中加入jdom4.创建一个beans.xml5.利用反射手写IOC并测试 Spring的IOC简介 概念        Spring的核心模块就是IOC机制,IOC是Inver...

一个好孩子啊的博客 603

Spring中IOC用到的反射机制

IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 本篇文章主要讲解一下IOC底层实现的原理(反射),Bean容器的实现,就不对IOC的概念进行详述了。 在Spring的配置文件中,经常看到如下配置: 那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器中去了了?对,就是通过反

坤健的博客 1952

Spring通过反射的方式在IOC容器中创建bean的理解

Spring通过反射的方式在IOC容器中创建bean的理解获取Class对象的三种方式通过类名获取 类名.class通过对象获取 对象名.getClass()通过全类名获取 class.forName(全类名)这里要说的是通过全类名获取bean 获取Class对象的三种方式 通过类名获取 类名.class 通过对象获取 对象名.getClass() 通过全类名获取 class.forName(全类...

qq_36088854的博客 1198

spring IOC 反射 bean生命周期

若依的核心价值在于降低开发门槛和提升迭代效率,尤其适合需要快速交付的企业级应用。其模块化设计和生态扩展能力,使其在金融、制造、政务等领域均有成功案例。开发者可根据项目规模(中小型 / 大型)、技术栈偏好(Java/Vue)和定制化需求,灵活选择若依的单体版、微服务版或低代码扩展版。Spring 是整个体系的基础,为 Spring MVC、Spring Boot 和 Spring Cloud 提供了核心功能和基础架构。

sv 1246
上一篇: 线上机器cpu突然飙高怎么办?- jvm调优实战
下一篇: JavaSE-09 Thread 多线程
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值