一、场景模拟

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();

    @Before
public 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");
} @Test
public void test() {
Human zhang3 = (Human) iocContrainner.getBean("zhang3");
zhang3.goHome();
Human li4 = (Human) iocContrainner.getBean("li4");
li4.goHome();
} }

Spring入门之一-------实现一个简单的IoC的更多相关文章

  1. spring boot: @Entity @Repository一个简单的数据读存储读取

    spring boot: @Entity @Repository一个简单的数据读存储读取 创建了一个实体类. 如何持久化呢?1.使用@Entity进行实体类的持久化操作,当JPA检测到我们的实体类当中 ...

  2. laravel学习:php写一个简单的ioc服务管理容器

    php写一个简单的ioc服务管理容器 原创: 陈晨 CoderStory 2018-01-14 最近学习laravel框架,了解到laravel核心是一个大容器,这个容器负责几乎所有服务组件的实例化以 ...

  3. JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP、IOC)

    接上篇<JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构.调试.部署>,通过一个简单的JSP WEB网站了解了JAVA WEB相关的知识,比如:Ser ...

  4. 基于Spring aop写的一个简单的耗时监控

    前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了.让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习. 背景: 在做项目的时候,大家肯定都遇到对一些 ...

  5. WCF入门, 到创建一个简单的WCF应用程序

    什么是WCF?  WCF, 英文全称(windows Communication Foundation) , 即为windows通讯平台. windows想到这里大家都知道了 , WCF也正是由微软公 ...

  6. Express入门教程:一个简单的博客

    来自:  http://ourjs.com/detail/56b2a6f088feaf2d031d2468 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, ...

  7. struts2入门第一天----------一个简单例

    搭建完环境后就可以动手去打代码了.首先创建一个简单的提交表单的jsp页面(html页面也可以), <%@ page language="java" import=" ...

  8. 无废话WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

  9. 【转】WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

随机推荐

  1. 解决css中display:inline-block产生的空隙问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. RabbitMq学习笔记——概念

    1.RabbitMQ简介 MQ全称为Message Queue(消息队列),是一种“应用程序”<—>“应用程序”的通信方法.MQ是一个典型的“消费”<—>“生产者”模型的代表, ...

  3. 搭建solr集群的时候出现 ./zkcli.sh:行13: unzip: 未找到命令

    主要的原因是: linux系统下面没有安装压缩解压工具    zip 和 unzip:需要我们自己手动的安装: 利用yum命令安装即可: yum install -y unzip zip

  4. Git如何合并Commit

    如果你在 push 你的修改之前想要将本地多次修改后的 commit 合并一下变得更好看,可以使用下面的方法. 指定你要合并的 commit 相关的命令有两种 你可以通过指定修改过去的几个 commi ...

  5. NLP之gensim

    一. 利用 jieba 进行分词,关键词提取 利用gensim下面的corpora,models,similarities 进行语料库建立,模型tfidf算法,稀疏矩阵相似度分析 # -*- codi ...

  6. Spring框架中的JDK与CGLib动态代理

    JDK和CGLib动态代理区别 JDK动态代理:利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler ...

  7. i春秋-密码-IceCTF-Alien Message

    题目: 对应的解题图片: 解的时候,符号大点的是大写,小点的是小写. IceCTF{gOOd_n3wZ_3vERyoN3_1_L1k3_fU7ur4Ma_4nd_tH3iR_4maZ1nG_3As7e ...

  8. JAVA虚拟机:内存回收策略及算法

    java虚拟机中的程序计数器区.虚拟机栈区.本地方法栈区3个区域是随着线程的创建而创建,随着线程的结束而结束时,内存自然得到回收,所以这三个区域不需要过多考虑内存的回收问题. java虚拟机中的方法区 ...

  9. Timer(阿里CTF)

    下载文件之后发现是.apk类型文件,于是百度搜索了一下推荐再电脑上安装安卓模拟器,都尝试了一下逍遥安卓是真的不好用,小白觉得还是BlueStacks好用一些,下载之后去安装打开就看到了, 什么都没有发 ...

  10. node - DeprecationWarning: Mongoose: `findOneAndUpdate()` and `findOneAndDelete()` without the `use

           1,  原因是因为:findOneAndUpdate()内部会使用findAndModify驱动,驱动即将被废弃,所以弹出警告!附上官方解释:Mongoose v5.5.8: Depre ...