一、场景模拟

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. spinner的使用

    item.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  2. Day9 - G - Doing Homework HDU - 1074

    有n个任务,每个任务有一个截止时间,超过截止时间一天,要扣一个分.求如何安排任务,使得扣的分数最少.Input有多组测试数据.第一行一个整数表示测试数据的组数第一行一个整数n(1<=n<= ...

  3. PHP+MySQL实现在线测试答题实例

    这个实例主要给大家介绍如何使用jQuery+PHP+MySQL来实现在线测试题,包括动态读取题目,答题完毕后台评分,并返回答题结果. 读取答题列表: $sql = "select * fro ...

  4. SSH框架系列:Spring AOP应用记录日志Demo

    分类: [java]2013-12-10 18:53 724人阅读 评论(0) 收藏 举报 1.简介 Spring 中的AOP为Aspect Oriented Programming的缩写,面向切面编 ...

  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:内嵌下拉菜单的按钮组

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. MQTT 协议学习:006-订阅主题 与 对应报文(SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK)

    背景 之前我们提到了怎么发布消息对应的报文:现在我们来看,订阅一个主题的报文是怎么样的. SUBSCRIBE - 订阅主题 客户端向服务端发送SUBSCRIBE报文用于创建一个或多个订阅.每个订阅注册 ...

  7. Windows驱动开发-_DRIVER_OBJECT结构体

    每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管理程序所创建的,内核对一个驱动只加载一个实例,是由内核中的I/O管理器负责加载的,驱动程序需要在Driver ...

  8. 环境变量方式使用 Secret【转】

    通过 Volume 使用 Secret,容器必须从文件读取数据,会稍显麻烦,Kubernetes 还支持通过环境变量使用 Secret. Pod 配置文件示例如下: 创建 Pod 并读取 Secret ...

  9. emmmmmmmmmmmmmmmmmm01

    当体会活着有多么难之后,就不要在那么随意的活着,今天有多么不在意自己的人生,明天就要加倍的被别的人左右自己的人生. 多思考,多学习,多总结,多创造.让自己成为有用的人,让自己未来有一天成为自己的主人.

  10. MySQL之表、列别名及各种JOIN连接详解

    MySQL在SQL中,合理的别名可以让SQL更容易以及可读性更高.别名使用as来表示,可以分为表别名和列别名,别名应该是先定义后使用才对,所以首先要了解sql的执行顺序(1) from(2) on(3 ...