Spring入門之一-------實現一個簡單的IoC
阿新 • • 發佈:2018-11-30
一、場景模擬
public interface Human { public void goHome(); }Human:人類,下班了該回家啦
public interface Car { void start(); void stop(); void turnLeft(); void turnRight(); }Car:汽車,可以啟動、停止、左轉、右轉
public class AudiCar implements Car{ publicAudiCar:奧迪汽車,實現Carvoid 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 !!!"); } }
public class BuickCar implements Car{ public void start() { System.out.println(this.getClass().getSimpleName() + ": start !!!"); }BuickCar:別克汽車,實現Carpublic 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 !!!"); } }
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(); } }