一、场景模拟

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. FTPClient下载文件,程序假死问题

    [所属类包] org.apache.commons.net.ftp.FTPClient [现象描述] 这两天java项目中用到了FTP下载,像之前的项目写好代码,但是点击下载后,程序调试到下面这一行, ...

  2. JDBC--调用函数&存错过程

    1.通过Connection对象的prepareCall()方法创建CallableStatement对象的实例,在使用prepareCall()方法时需传入一个String类型的字符串,该字符串用于 ...

  3. Maven项目- get请求的乱码问题,使用tamcat7出现乱码的解决方法

    get请求的乱码问题: 解决方法: 手动处理编码

  4. Django 数据库访问性能优化

    使用标准的数据库优化技术: 在进行Django数据库访问性能优化之前,首先应该使用标准的数据库技术对其进行优化,比如给字段加索引,通过使用 django.db.models.Field.db_inde ...

  5. leetcode743 Network Delay Time

    """ here are N network nodes, labelled 1 to N. Given times, a list of travel times as ...

  6. java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)(转)

    Caused by: java.io.FileNotFoundException: rmi_keystore.jks (没有那个文件或目录) 解决方法:修改jmeter.properites: ser ...

  7. 使用zabbix server监控tomcat实战案例

    使用zabbix server监控tomcat实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大家都知道,zabbix server效率高是使用C语言编写的,有很多应用程序 ...

  8. R 《回归分析与线性统计模型》page119,4.2

    rm(list = ls()) library(openxlsx) library(MASS) data = read.xlsx("xiti_4.xlsx",sheet = 2) ...

  9. PHP使用ElasticSearch做搜索

    PHP 使用 ElasticSearch 做搜索 https://blog.csdn.net/zhanghao143lina/article/details/80280321 https://www. ...

  10. 014.Oracle数据库,取本周第一天(星期一), 取本周最后一天(星期天)

    /*取本周第一天(星期一),取本周最后一天(星期天)*/ SELECT trunc( SYSDATE, AS 星期一 , trunc( SYSDATE, AS 星期天 FROM dual; 效果如下: ...