佛山網(wǎng)站開(kāi)發(fā)網(wǎng)絡(luò)營(yíng)銷方式有哪幾種
介紹一下Spring的IOC
- ??引言
- ?? lOC的優(yōu)點(diǎn)
- ??Spring的IOC
- ?? 拓展知識(shí)倉(cāng)
- ??IOC是如何實(shí)現(xiàn)的?
??引言
所謂的IOC (inversion of control) ,就是控制反轉(zhuǎn)的意思。何為控制反轉(zhuǎn)?
在傳統(tǒng)的程序設(shè)計(jì)中,應(yīng)用程序代碼通常控制著對(duì)象的創(chuàng)建和管理。例如,一個(gè)對(duì)象需要依賴其他對(duì)象,那么它會(huì)直接new出來(lái)對(duì)象。這樣的設(shè)計(jì)通常被稱為 “控制流程” 。
而在IOC 中,控制關(guān)系發(fā)生了反轉(zhuǎn)??刂茩?quán)被轉(zhuǎn)移到Spring容器中,容器負(fù)責(zé)創(chuàng)建和管理對(duì)象,并在需要的時(shí)候?qū)⑺鼈冏⑷氲綉?yīng)用程序中。
所以,原來(lái)這個(gè)對(duì)象的控制權(quán)在我們的代碼中,我們自己new的對(duì)象,在Spring中,應(yīng)用程序不再控制對(duì)象的創(chuàng)建,而是被動(dòng)地接受由容器注入的對(duì)象。
我們拿代碼來(lái)舉個(gè)例了:
下面是一個(gè)沒(méi)有IOC的例子:
class A {}Class B {// B需要將A的實(shí)例new出來(lái),也就是我們說(shuō)的控制private A a = new A();public void use() {System.out.print(a) ;}
}
當(dāng)有了IOC之后
@Component //說(shuō)明A自己控制自己,把自己初始化出來(lái),注入給了容器
class A {}class B {// B不需要控制a,直接使用。如果A沒(méi)有把自己注入給容器,B就不能使用@Resourceprivate A a;public void use() {System.out .print(a);}
}
也就是說(shuō),沒(méi)有Spring的話,我們要使用的對(duì)象,需要我們自己創(chuàng)建,而有了Spring的IOC之后,對(duì)象由IOC容器創(chuàng)建并管理,我們只需要在想要使用的時(shí)候從容器中獲取就行了。
值得說(shuō)明的是,IOC只是一種思想和理念,可以有不同的實(shí)現(xiàn)方式。
?? lOC的優(yōu)點(diǎn)
使用IOC,有最少三個(gè)好處:
1 . 使用者不用關(guān)心引用bean的實(shí)現(xiàn)細(xì)節(jié),警如對(duì)于 B b = new A(c,d,e,f);來(lái)說(shuō),如果B要使用A,那還要把c,d,e,f多個(gè)類全都感知一遍,這顯然是非常麻煩且不合理的
2 . 不用創(chuàng)建多個(gè)相同的bean導(dǎo)致浪費(fèi),仍然是
A b = new A();
A z = new A();
如果B和Z都引用了A,那么B和Z就可能new 兩個(gè)A實(shí)例,實(shí)際上,我們只需要一個(gè)就好了。
3 . Bean的修改使用方無(wú)需感知。同樣是上面的例子,假如說(shuō)BeanA需要修改,如果沒(méi)有IOC的話,所有引用到A的其他bean都需要感知這個(gè)邏輯,并且做對(duì)應(yīng)的修改,但是如果使用了IOC,其他bean就完全不用感知到。
??Spring的IOC
對(duì)于Spring的IOC來(lái)說(shuō),它是IOC思想的一種實(shí)現(xiàn)方式。在容器啟動(dòng)的時(shí)候,它會(huì)根據(jù)每個(gè)bean的要求,將bean注入到SpringContainer中。如果有其他bean需要使用,就直接從容器中獲取即可,如下圖所示:
?? 拓展知識(shí)倉(cāng)
??IOC是如何實(shí)現(xiàn)的?
使用Spring的IOC容器能力,非常簡(jiǎn)單,如下代碼所示:
ApplicationContext context= new AnnotationConfigApplicationContext("cn.wxxlamp.spring.ioc");
Bean bean = context.getBean(Bean.class) ;
bean . use() ;
從上面的代碼中,我們也能看出來(lái)Spring的IOC是如何實(shí)現(xiàn)的:
1 . 從配置元數(shù)據(jù)中獲取要DI的業(yè)務(wù)POJO (這里的配置元數(shù)據(jù)包括xml,注解,configuration類等)
2 . 將業(yè)務(wù)POJO形成BeanDefinition注入到Spring Container中
3 . 使用方通過(guò)ApplicationContext從Spring Container直接獲取即可。如下圖所示: