IOC控制反轉(zhuǎn)(Inversion of Control)
我們傳統(tǒng)的javaSE程序等都基本是一種典型的相互依賴的程序,也就是一些相互協(xié)作的對(duì)象構(gòu)成的。也就是我們所說的正轉(zhuǎn),即是通過硬編程new一些對(duì)象然后對(duì)象間相互依賴。所謂的的控制反轉(zhuǎn)就是把創(chuàng)建和查找對(duì)象交給容器。
目的:IOC是一種編程思想,建立一個(gè)松散耦合的程序。(高內(nèi)聚,低耦合的思想)
把對(duì)對(duì)象的控制權(quán)交給IOC容器控制對(duì)象的生命周期和對(duì)象間的關(guān)系
-
通過例子理解:
- 原始社會(huì)中,比如我們需要斧子,就得自己設(shè)計(jì)斧子,打造斧子,最后才能用這把自己做的斧子。這就有點(diǎn)類似JAVA中自己創(chuàng)建一個(gè)對(duì)象,然后通過new的方式創(chuàng)建一個(gè)對(duì)象調(diào)用對(duì)象的方法。
- 在工業(yè)社會(huì)中,比如我們需要斧子,就的去商店購(gòu)買一把斧子,而這把斧子就從工廠中生產(chǎn)出來的。這個(gè)時(shí)候就像是JAVA中工廠模式,需要某些對(duì)象時(shí)候就通過簡(jiǎn)單的工廠模式設(shè)計(jì),我們只要調(diào)用工廠類就可以得到想要的對(duì)象。
- 在牛逼的共產(chǎn)主義社會(huì)中,我們就只要坐等斧子的到來,全自動(dòng)的給我們斧子對(duì)象,等待IOC容器的注入對(duì)象。(無需理會(huì)斧子要怎么new一個(gè)對(duì)象,無需定位工廠類)
DI依賴注入(Dependency Injection)
其實(shí)IOC依賴注入和DI控制反轉(zhuǎn)是統(tǒng)一的,在一個(gè)運(yùn)行的IOC容器中,容器能夠動(dòng)態(tài)的提供給一些需要的其他對(duì)象或者說組件中。這些需要的對(duì)象就是通過DI這個(gè)方式注入來實(shí)現(xiàn)的。至于怎么實(shí)現(xiàn),就是通過JAVA的反射機(jī)制來實(shí)現(xiàn)的。
- 注入的方式:
- setter設(shè)值注入
- 構(gòu)造注入
- java的反射機(jī)制
- 概念:在java運(yùn)行的過程中,對(duì)于任意的類都可以知道他的所有屬性和方法,對(duì)于任意一個(gè)對(duì)象都可以調(diào)用他的屬性和方法,這種動(dòng)態(tài)獲取對(duì)象和調(diào)用對(duì)象方法的功能。
- 反射機(jī)制獲取類有三種方法:
//第一種方式: Classc1 = Class.forName("Employee"); //第二種方式: //java中每個(gè)類型都有class 屬性. Classc2 = Employee.class; //第三種方式: //java語(yǔ)言中任何一個(gè)java對(duì)象都有g(shù)etClass 方法 Employeee = new Employee(); Classc3 = e.getClass(); //c3是運(yùn)行時(shí)類 (e的運(yùn)行時(shí)類是Employee)
- 創(chuàng)建對(duì)象:獲取類以后我們來創(chuàng)建它的對(duì)象,利用newInstance
Class c =Class.forName("Employee"); //創(chuàng)建此Class 對(duì)象所表示的類的一個(gè)新實(shí)例 Objecto = c.newInstance(); //調(diào)用了Employee的無參數(shù)構(gòu)造方法.
- 獲取屬性:分為所有的屬性和指定的屬性:
``` /獲取整個(gè)類 Class c = Class.forName("java.lang.Integer"); //獲取所有的屬性? Field[] fs = c.getDeclaredFields(); //定義可變長(zhǎng)的字符串,用來存儲(chǔ)屬性 StringBuffer sb = new StringBuffer(); //通過追加的方法,將每個(gè)屬性拼接到此字符串中 //最外邊的public定義 sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n"); //里邊的每一個(gè)屬性 for(Field field:fs){ sb.append("\t");//空格 sb.append(Modifier.toString(field.getModifiers())+" ");//獲得屬性的修飾符,例如public,static等等 sb.append(field.getType().getSimpleName() + " ");//屬性的類型的名字 sb.append(field.getName()+";\n");//屬性的名字+回車 } sb.append("}"); System.out.println(sb); ``` ``` public static void main(String[] args) throws Exception{ /* User u = new User(); u.age = 12; //set System.out.println(u.age); //get */ //獲取類 Class c = Class.forName("User"); //獲取id屬性 Field idF = c.getDeclaredField("id"); //實(shí)例化這個(gè)類賦給o Object o = c.newInstance(); //打破封裝 idF.setAccessible(true); //使用反射機(jī)制可以打破封裝性,導(dǎo)致了java對(duì)象的屬性不安全。 //給o對(duì)象的id屬性賦值"110" idF.set(o, "110"); //set //get System.out.println(idF.get(o)); } ```