Java学习笔记-对IoC(Inversion of Control)的基本认识
生活随笔
收集整理的這篇文章主要介紹了
Java学习笔记-对IoC(Inversion of Control)的基本认识
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
?
?
基本認識
實例
自己的感悟
?
基本認識
Ioc:Inversion of Control 控制反轉、依賴注入
控制:控制對象(Java Bean)的創建以及銷毀(生命周期)
反轉:將對象的控制權交給IoC容器
?
下面例子圍繞這三點:
? ? ? ? ? 1. 所有的Bean的生命周期交由IoC容器管理;
? ? ? ? ? 2. 所有被依賴的Bean通過構造方法執行注入;
? ? ? ? ? 3.??被依賴的Bean需要優先創建;
?
實例
程序的運行截圖如下:
Audi是張三開的,Buick是李四開的!
程序結構如下:
源碼如下:
Audi.java
package ioc.demo.IocDemo.car;public class Audi implements Car {public void start(){System.out.println("Audi. start");}public void turnLeft(){System.out.println("Audi. turnLeft");}public void turnRight(){System.out.println("Audi. turnRight");}public void stop(){System.out.println("Audi. stop");} }buick.java
package ioc.demo.IocDemo.car;public class Buick implements Car {public void start(){System.out.println("Buick. start");}public void turnLeft(){System.out.println("Buick. turnLeft");}public void turnRight(){System.out.println("Buick. turnRight");}public void stop(){System.out.println("Buick. stop");} }Car.java
?
Humen.java
package ioc.demo.IocDemo.humen;public interface Humen {public void goHome(); }HumenWithCar.java
package ioc.demo.IocDemo.humen;import ioc.demo.IocDemo.car.Car;public abstract class HumenWithCar implements Humen{protected Car car;public HumenWithCar(Car car){this.car = car;}public abstract void goHome(); }LiSi.java
?
ZhangSan.java
package ioc.demo.IocDemo.humen;import ioc.demo.IocDemo.car.Car;public class ZhangSan extends HumenWithCar{public ZhangSan(Car car){super(car);}@Overridepublic void goHome() {car.start();car.turnLeft();car.turnRight();car.stop();} }IoCContainer.java
package ioc.demo.IocDemo;import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap;/**1. 實例化Bean2. 保存bean3. 提供bean4. 每一個bean要產生一個唯一的id與之對應*/ public class IoCContainer {private Map<String, Object> beans = new ConcurrentHashMap<String, Object>();/***根據beanId獲取一個Bean* @param 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的構造方法所需要的參數的beanId們*/public void setBeans(Class<?> clazz, String beanId, String... paramBeanIds){//1. 組裝構造方法所需要的參數值;Object[] paramValues = new Object[paramBeanIds.length];for (int i = 0; i < paramBeanIds.length; i++){paramValues[i] = beans.get(paramBeanIds[i]);}//2. 調用構造方法實例化的bean;Object bean = null;for (Constructor<?> constructor : clazz.getConstructors()) {try {bean = constructor.newInstance(paramValues);} catch (InstantiationException e) {} catch (IllegalAccessException e) {} catch (InvocationTargetException e) {}}if(bean == null){throw new RuntimeException("找不到合適的構造方法去實例化bean");}//3. 將實例化的bean放入beans;beans.put(beanId, bean);} }調用的代碼:
package ioc.demo;import ioc.demo.IocDemo.IoCContainer; import ioc.demo.IocDemo.car.Audi; import ioc.demo.IocDemo.car.Buick; import ioc.demo.IocDemo.humen.Humen; import ioc.demo.IocDemo.humen.LiSi; import ioc.demo.IocDemo.humen.ZhangSan; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class) @SpringBootTest public class DemoApplicationTests {private IoCContainer ioCContainer = new IoCContainer();@Beforepublic void before(){ //創建Bean和使用Bean是兩個不同的業務邏輯ioCContainer.setBeans(Audi.class, "audi");ioCContainer.setBeans(Buick.class, "Buick");ioCContainer.setBeans(ZhangSan.class, "ZhangSan", "audi");ioCContainer.setBeans(LiSi.class, "LiSi", "Buick");ioCContainer.setBeans(Audi.class, "audi");}@Testpublic void contextLoads() {Humen zhangesan = (Humen) ioCContainer.getBean("ZhangSan");zhangesan.goHome();Humen liSi = (Humen) ioCContainer.getBean("LiSi");liSi.goHome();}}?
自己的感悟
這里發現一個東西,Java因為有反射機制,所以可以使用IoC的思想,實現控制翻轉,依賴注入,這個是C++做不到的,在程序的邏輯結構,和設計上,這種方式的確是相當的好!
總結
以上是生活随笔為你收集整理的Java学习笔记-对IoC(Inversion of Control)的基本认识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统架构师学习笔记-基于构件的开发
- 下一篇: 前端笔记-StackedBar3D的初步