一、场景模拟

public interface Human {public void goHome();}

Human:人类,下班了该回家啦

public interface Car {void start();void stop();void turnLeft();void turnRight();}

Car:汽车,可以启动、停止、左转、右转

public class AudiCar implements Car{public void start() {System.out.println(this.getClass().getSimpleName() + ": start !!!");}public void stop() {System.out.println(this.getClass().getSimpleName() + ": stop !!!");}public void turnLeft() {System.out.println(this.getClass().getSimpleName() + ": turnLeft !!!");}public void turnRight() {System.out.println(this.getClass().getSimpleName() + ": turnRight !!!");}
}

AudiCar:奥迪汽车,实现Car

public class BuickCar implements Car{public void start() {System.out.println(this.getClass().getSimpleName() + ": start !!!");}public void stop() {System.out.println(this.getClass().getSimpleName() + ": stop !!!");}public void turnLeft() {System.out.println(this.getClass().getSimpleName() + ": turnLeft !!!");}public void turnRight() {System.out.println(this.getClass().getSimpleName() + ": turnRight !!!");}
}

BuickCar:别克汽车,实现Car

public abstract class HumenWithCar implements Human{protected final Car car;public HumenWithCar(Car car) {this.car = car;}public abstract void goHome();}

HumenWithCar有车一族,实现Human,拥有Car属性

public class Zhang3Human extends HumenWithCar{public Zhang3Human(Car car) {super(car);}public void goHome() {car.start();car.turnLeft();car.stop();}
}

Zhang3Human:张三,有车一族

public class Li4Human extends HumenWithCar{public Li4Human(Car car) {super(car);}public void goHome() {car.start();car.turnRight();car.stop();}
}

Li4Human:李四,有车一族

二、定义IoC容器

public class IocContrainner {/*** 用来存储beans,String为bean的id,Object为bean本身*/private final Map<String, Object> beans = new HashMap<String, Object>();/*** 根据beanId获取一个bean* @param beanId beanId* @return 返回bean*/public Object getBean(String beanId) {return beans.get(beanId);}/*** 委托IoC容器创建一个bean* @param clazz 要创建的bean的class* @param beanId beanId* @param paramBeanIds 要创建的bean的class的构造方法所依赖的bean*/public void registerBean(Class<?> clazz, String beanId, String... paramBeanIds)  {Object[] paramValues = new Object[paramBeanIds.length];for (int i = 0; i < paramBeanIds.length; i++) {Object paramValue = getBean(paramBeanIds[i]);if (paramValue == null) {throw new RuntimeException("Can't find bean of id: " + paramBeanIds[i]);}paramValues[i] = paramValue;}Object bean = null;// 获取并循环所有的构造方法Constructor<?>[] constructors = clazz.getConstructors();for (Constructor<?> constructor : constructors) {try {bean = constructor.newInstance(paramValues);} catch (InstantiationException e) {} catch (IllegalAccessException e) {} catch (InvocationTargetException e) {}}if (bean == null) {throw new RuntimeException("找不到合适的构造方法:" + paramBeanIds);}beans.put(beanId, bean);}
}

三、测试

public class IocContrainnerTest {private final IocContrainner iocContrainner = new IocContrainner();@Beforepublic void before() {iocContrainner.registerBean(AudiCar.class, "audi");iocContrainner.registerBean(PorscheCar.class, "porsche");iocContrainner.registerBean(BuickCar.class, "buick");iocContrainner.registerBean(Zhang3Human.class, "zhang3", "audi");iocContrainner.registerBean(Li4Human.class, "li4", "porsche");}@Testpublic void test() {Human zhang3 = (Human) iocContrainner.getBean("zhang3");zhang3.goHome();Human li4 = (Human) iocContrainner.getBean("li4");li4.goHome();}}

转载于:https://www.cnblogs.com/LOVE0612/p/10044896.html

Spring入门之一-------实现一个简单的IoC相关推荐

  1. 徒手撸一个简单的IOC

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:不学无数的程序员 juejin.im/post/5c4ac4 ...

  2. 徒手撸一个简单的 IOC

    Spring框架中最经典的两个就是IOC和AOP,其中IOC(Inversion of Control)是什么呢?控制反转,简单来说就是将控制实体Bean的动作交给了Spring容器进行管理.再简单点 ...

  3. 手写一个简单的IOC容器

    手写一个简单的IOC容器 原文 http://localhost:4000/2020/02/25/SSM/spring/%E6%89%8B%E5%86%99%E4%B8%80%E4%B8%AA%E5% ...

  4. ROS2入门教程—创建一个简单的订阅者和发布者(C++版)

    ROS2入门教程-创建一个简单的订阅者和发布者(C++版) 1 创建功能包 2 创建发布者节点 3 设置发布者节点依赖项 4 设置发布者节点编译规则 5 创建订阅者 6 编译并运行   节点是通过RO ...

  5. spring诸如方式_一个简单的步进器,具有诸如下一步,返回和结束之类的简单动作,可以执行简单的表格

    spring诸如方式 Vue步进器. (Stepper for Vue.) A simple stepper with simple actions such as next, back and fi ...

  6. python构建知识图谱_NLP第20课:Neo4j 从入门到构建一个简单知识图谱

    Neo4j 对于大多数人来说,可能是比较陌生的.其实,Neo4j 是一个图形数据库,就像传统的关系数据库中的 Oracel 和 MySQL一样,用来持久化数据.Neo4j 是最近几年发展起来的新技术, ...

  7. Neo4j 从入门到构建一个简单知识图谱

    Neo4j 对于大多数人来说,可能是比较陌生的.其实,Neo4j 是一个图形数据库,就像传统的关系数据库中的 Oracel 和 MySQL一样,用来持久化数据.Neo4j 是最近几年发展起来的新技术, ...

  8. 如何利用spring框架来开发一个简单的小项目——书店项目

    这里我将用spring来开发一个简单的书店项目 Step1:所用到的开发软件为 idea , 所用到的jar包为 这些jar的下载可在 官网 下载,选择5.2.6版本下载,不会的在下面评论私信 Ste ...

  9. node.js入门 - 2.创建一个简单聊天室

    这篇文章将通过开发一个简单聊天室的方式,介绍node.js的net模块. 一.第一版,只向客户端发送信息   我们先实现一个简单的版本,代码如下: var net=require('net'); va ...

最新文章

  1. 第1章 故障处理方法
  2. LayUi 树形组件tree 实现懒加载模式,展开父节点时异步加载子节点数据
  3. UM功能实现和配置技巧(上)--语音邮件、传真功能
  4. mysql fio测试_MySQL Hardware--FIO压测
  5. 简述SAS逻辑库的概念及建立方法。什么是临时库和永久库?
  6. 批量更新数据(BatchUpdate)
  7. nutch2.1分布式抓取
  8. 今天是 OSChina 上线 6 周年!
  9. 字节新产品「识区APP」上线
  10. python3 selenium安装教程_Mac OS下搭建 python3+pycharm+selenium+Chrome环境
  11. python判断变量相等_Python判断两个对象相等的原理
  12. Qt 动图 播放png阵列 避免使用gif导致失真
  13. C语言正交表测试用例,用正交表设计测试用例
  14. 星广互动推出全球首个智能AR广告平台 重塑UGC视频广告价值
  15. 微信程序开发系列教程(二)微信订阅号+人工智能问答服务
  16. siki学院Vector2 Vector3 Rigidbody Application笔记
  17. 明明现在科技发达了,互联网公司却纷纷搞起了996, 996没有未来
  18. Pytorch学习之torch----Reduction Ops
  19. java工程师 英文_java软件工程师英文简历模板
  20. unet分割如何取其中一类_深度学习与医学图像处理 案例学习1——Unet肺部分割(CT图像)...

热门文章

  1. c++thread里暂停线程_多线程技术
  2. centos 安装idea 非可视化_太厉害了!目前 Redis 可视化工具最全的横向评测
  3. 相机视场角和焦距_镜头小讲堂(一)镜头的焦距
  4. android 控件方向旋转90度,android – 旋转视图层次90度
  5. Struts2_2_解决配置文件冗余_动作类对象数据封装_数据类型转换_表单数据信息提示
  6. 【Pytorch神经网络理论篇】 18 循环神经网络结构:LSTM结构+双向RNN结构
  7. python装饰器函数执行后日志_python 装饰器理解
  8. LeetCode 1874. 两个数组的最小乘积和
  9. LeetCode 1599. 经营摩天轮的最大利润(模拟)
  10. LeetCode 520. 检测大写字母