简单模拟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容器的操作的更多相关文章

  1. 一道面试题,简单模拟spring ioc

    自己实现的,程序写的土了点,很多情况没去考虑,主要是复习理解怎么使用反射来实现spring 的依赖注入. package dom4jtest; import java.lang.reflect.Inv ...

  2. 自定义模拟一个Spring IOC容器

    一.模拟一个IOC容器: 介绍:现在,我们准备使用一个java project来模拟一个spring的IOC容器创建对象的方法,也就是不使用spring的jar自动帮助我们创建对象,而是通过自己手动书 ...

  3. 深入理解Spring IoC容器和动态代理机制

    Deployment期间验证 实现一: <bean id="theTargetBean" class="..."/> <bean id=&qu ...

  4. 对Spring IoC容器实现的结构分析

    本文的目标:从实现的角度来认识SpringIoC容器. 观察的角度:从外部接口,内部实现,组成部分,执行过程四个方面来认识SpringIoC容器. 本文的风格:首先列出SpringIoC的外部接口及内 ...

  5. 详解Spring IoC容器

    一.Spring IoC容器概述 1.依赖反转(依赖注入):依赖对象的获得被反转了. 如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测试性的降低,这对复杂的面向对象系统的 ...

  6. 造轮子:实现一个简易的 Spring IoC 容器

    作者:DeppWang.原文地址 我通过实现一个简易的 Spring IoC 容器,算是入门了 Spring 框架.本文是对实现过程的一个总结提炼,需要配合源码阅读,源码地址. 结合本文和源码,你应该 ...

  7. 深入理解Spring IOC容器

    本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...

  8. 深入理解Spring IOC容器及扩展

    本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...

  9. Spring IOC容器分析(4) -- bean创建获取完整流程

    上节探讨了Spring IOC容器中getBean方法,下面我们将自行编写测试用例,深入跟踪分析bean对象创建过程. 测试环境创建 测试示例代码如下: package org.springframe ...

随机推荐

  1. 【记录一个问题】android下的ucontext协程,因为使用栈上的对象,导致cv::Mat被莫名析构

    工作的流程是这样:某个协程在栈上创建task对象,在task对象内有需要返回的cv::Mat. 然后把task放到另一个线程上去执行,然后切换到别的协程,等到工作线程执行完task后,再唤醒协程. 这 ...

  2. c#操作符详解

    操作符概览 操作符(Operator)也译为"运算符" 操作符是用来操作数据的,被操作符操作的数据称为操作数(Operand) 操作符的本质 操作符的本质是函数(即算法)的&quo ...

  3. 实习之bii--关于虚拟机桥接无线网卡

    安装完VMware workstation之后,网络连接里会多出两个虚拟网卡: VMware Network Adapter VMnet1和VMware Network Adapter VMnet8. ...

  4. golang中float类型转换成int类型

    package main import ( "fmt" "strconv" ) func f2i(f float64) int { i, _ := strcon ...

  5. 返回值Student处理过程

  6. Servlet-请求的分发处理

    1,HelloServlet类中 2,a.html中

  7. 技巧02--Terminal Preview优化

    0x00 下载安装 可在MS应用商店安装,也可以直接百度下载安装包安装 0x01 设置默认自启 0x02 Terminal Preview美化 1.打开终端settings 2.点击这个Open JS ...

  8. linux中uniq命令全面解析

    目录 一 :uniq作用 二:uniq格式 1.参数 2.参数案例解析: linuxuniq简介 Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用. u ...

  9. python类和函数

    #/usr/bin/python #coding=utf-8 class Car(): def __init__(self,name,year): self.name = name self.year ...

  10. SQLite 基础不扎实造成的:error code 19: constraint failed

    感谢大佬:https://www.cnblogs.com/flintlovesam/p/5241866.html (https://www.cnblogs.com/flintlovesam/p/524 ...