(反射+内省机制的运用)简单模拟spring IoC容器的操作
简单模拟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();
}
(反射+内省机制的运用)简单模拟spring IoC容器的操作的更多相关文章
- 一道面试题,简单模拟spring ioc
自己实现的,程序写的土了点,很多情况没去考虑,主要是复习理解怎么使用反射来实现spring 的依赖注入. package dom4jtest; import java.lang.reflect.Inv ...
- 自定义模拟一个Spring IOC容器
一.模拟一个IOC容器: 介绍:现在,我们准备使用一个java project来模拟一个spring的IOC容器创建对象的方法,也就是不使用spring的jar自动帮助我们创建对象,而是通过自己手动书 ...
- 深入理解Spring IoC容器和动态代理机制
Deployment期间验证 实现一: <bean id="theTargetBean" class="..."/> <bean id=&qu ...
- 对Spring IoC容器实现的结构分析
本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...
- 详解Spring IoC容器
一.Spring IoC容器概述 1.依赖反转(依赖注入):依赖对象的获得被反转了. 如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测试性的降低,这对复杂的面向对象系统的 ...
- 造轮子:实现一个简易的 Spring IoC 容器
作者:DeppWang.原文地址 我通过实现一个简易的 Spring IoC 容器,算是入门了 Spring 框架.本文是对实现过程的一个总结提炼,需要配合源码阅读,源码地址. 结合本文和源码,你应该 ...
- 深入理解Spring IOC容器
本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...
- 深入理解Spring IOC容器及扩展
本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...
- Spring IOC容器分析(4) -- bean创建获取完整流程
上节探讨了Spring IOC容器中getBean方法,下面我们将自行编写测试用例,深入跟踪分析bean对象创建过程. 测试环境创建 测试示例代码如下: package org.springframe ...
随机推荐
- C# TCP传输文件示例代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- [硬拆解]拆解一个USB转CAN-FD总线设备-PCAN-USB FD
描述 CAN FD适配器PCAN-USB FD允许通过USB将CAN FD和CAN网络连接到计算机.高达500伏的电流隔离将PC与CAN总线分离.简单的操作及其紧凑的塑料外壳使该适配器适用于移动应用. ...
- 计算机二级考试office专题之绝对引用相对引用
- 【解决了一个小问题】golang的go.mod中出现版本错误
代码中的这一句使用prometheus2.28.0版本的代码: import "github.com/prometheus/prometheus/prompb" 我把require ...
- gorm链接mysql的初始化配置和连接池的使用
1. mysql的初始化配置 dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s", user, passwd, host, port, db, ...
- mysqldump 逻辑备份和物理备份
逻辑备份 逻辑备份是备份sql语句,在恢复的时候执行备份的sql语句实现数据库数据的重现. 工具:mysqldump 特点: 1.可移植性比较强 2.备份和恢复的花费时间长,不适用于大型业务系统 物理 ...
- IEEE754浮点数表示法
IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985)是一套规定如何用二进制表示浮点数的标准.就像"补码规则"建立了二进制位和正负数的一一对应关系一样,IEE ...
- HTML(前端web)
目录 一:HTML前端 1.什么是前端? 2.什么是后端? 3.什么是HTML? 4.HTML不是什么? 5.前端的学习流程 6.BS架构 7.搭建服务器 简易(浏览器访问) 8.浏览器访问报错原因 ...
- Kubernetes之日志和监控(十五)
一.日志和监控 1.1.Log 1.1.1.容器级别 通过docker命令查看容器级别的日志 docker ps --->containerid docker logs containerid ...
- python 列表删除元素,单个元素,多个连续或不连续元素
以列表a为例 import numpy as np a = ['上海市', '云南省', '内蒙古', '四川省', '天津市', '宁夏', '安徽省', '山东省', '山西省'] 删除单个元素 ...