1.概念
IOC(控制反轉(zhuǎn))是一種設(shè)計(jì)思想历极,旨在實(shí)現(xiàn)調(diào)用類和實(shí)現(xiàn)類的松耦合捕犬,調(diào)用類只依賴接口坦敌,在編譯階段并不知道具體使用哪個實(shí)現(xiàn)類,而是將這個控制權(quán)交給第三方容器希坚,在運(yùn)行時由容器將實(shí)例變量(具體的實(shí)現(xiàn)類)注入到對象中(調(diào)用類)边苹。
DI(依賴注入)是具體的實(shí)現(xiàn)技術(shù),是指由第三方組件負(fù)責(zé)將實(shí)例變量(實(shí)現(xiàn)類)傳入到對象(調(diào)用類)中去裁僧。
2.IoC的兩種設(shè)計(jì)模式
2.1 反射:在運(yùn)行狀態(tài)中个束,根據(jù)提供的類的路徑或類名,通過反射來動態(tài)地獲取該類所有屬性的方法
2.2 工廠模式:把IoC容器當(dāng)作一個工廠聊疲,在配置文件或注解中給出定義茬底,然后利用反射技術(shù),根據(jù)給出的類名生成相應(yīng)的對象
3.DI的兩種注入方式
3.1構(gòu)造器注入
-
構(gòu)造器注入是在Bean構(gòu)造過程中執(zhí)行的
3.2 Setter注入
-
Setter注入是在Bean示例創(chuàng)建完畢之后執(zhí)行
4.總結(jié)
- Spring引入Autowire(自動裝配)機(jī)制就是為了解決<bean>標(biāo)簽下<property>標(biāo)簽或<constructor-arg>標(biāo)簽過多的問題
- 對于強(qiáng)依賴售睹,可使用構(gòu)造器注入桩警,對于弱依賴,推薦使用Setter注入
5.課后
5.1什么是反射
- JAVA中反射是動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的一種反射機(jī)制昌妹。
- Java反射就是在運(yùn)行狀態(tài)中捶枢,對于任意一個類,都能夠知道這個類的所有屬性和方法飞崖;對于任意一個對象烂叔,都能夠調(diào)用它的任意方法和屬性;并且能改變它的屬性固歪。而這也是Java被視為動態(tài)語言的一個關(guān)鍵性質(zhì)蒜鸡。
- Java反射的功能是在運(yùn)行時判斷任意一個對象所屬的類,在運(yùn)行時構(gòu)造任意一個類的對象牢裳,在運(yùn)行時判斷任意一個類所具有的成員變量和方法逢防,在運(yùn)行時調(diào)用任意一個對象的方法,生成動態(tài)代理蒲讯。
5.2反射的用途
- 當(dāng)我們在使用 IDE(如 Eclipse\IDEA)時忘朝,當(dāng)我們輸入一個隊(duì)長或者類并向調(diào)用它的屬性和方法時,一按 (“.”)點(diǎn)號判帮,編譯器就會自動列出她的屬性或方法局嘁,這里就會用到反射溉箕。
5.3反射的實(shí)例
- 獲取對象的類型名稱
public class Reflection HelloWorld {
public static void main(String[] args){
Foo f = newFoo();
System.out.println(f.getClass().getName());
}
}
class Foo {
publicvoid print() {
System.out.println("abc");
}
}
輸出結(jié)果
myreflection.Foo
- 調(diào)用未知對象的方法
public class Reflection HelloWorld {
public static void main(String[] args){
Foo f = newFoo();
Method method;
try{
method = f.getClass().getMethod("print",newClass<?>[0]);
method.invoke(f);
}catch(Exception e) {
e.printStackTrace();
}
}
}
class Foo {
public void print() {
System.out.println("abc");
}
}
輸出結(jié)果
abc
- 創(chuàng)建對象
public class Reflection HelloWorld {
publi cstatic void main(String[] args){
// 創(chuàng)建Class實(shí)例
Class<?> c = null;
try{
c=Class.forName("myreflection.Foo");
}catch(Exception e){
e.printStackTrace();
}
// 創(chuàng)建Foo實(shí)例
Foo f = null;
try{
f = (Foo) c.newInstance();
}catch(Exception e) {
e.printStackTrace();
}
f.print();
}
}
class Foo {
public void print() {
System.out.println("abc");
}
}
輸出結(jié)果
null
abc