Spring入门之一-------实现一个简单的IoC
2024-09-05 06:32:45
一、场景模拟
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();
} }
最新文章
- 浅谈我对DDD领域驱动设计的理解
- 使用GDB调试程序
- 学习笔记:利用GDI+生成简单的验证码图片
- SQLSERVER DBA容易犯的十个错误
- iOS 定制controller过渡动画 ViewController Custom Transition使用体会
- UIPanGestureRecognizer中translationInView的理解
- Shell指令
- 禁用 Browser Link,在浏览器调试的时候回出现大量的get,post数据。
- akka构建简单分布式应用
- dp题目
- 转:memset用法详解
- java中四种操作xml方式的比较
- mybatis 模糊查询 like的三种方式
- Centos下启动和关闭MySQL
- 简单粗暴的上传项目至 Github
- zabbix安装脚本
- Webservice返回json数据格式
- 16.和input相关的知识点
- ORM框架 之 Entity Framework
- ceph-mon 代码解读