Spring中IoC優(yōu)點與缺點解析
本文為大家分享了Spring中IoC優(yōu)點與缺點,供大家參考,具體內容如下
1. 優(yōu)點
我們知道,在Java基本教程中有一個定律告訴我們:所有的對象都必須創(chuàng)建;或者說:使用對象之前必須創(chuàng)建,但是現(xiàn)在我們可以不必一定遵循這個定律了,我們可以從Ioc容器中直接獲得一個對象然后直接使用,無需事先創(chuàng)建它們。
這種變革,就如同我們無需考慮對象銷毀一樣;因為Java的垃圾回收機制幫助我們實現(xiàn)了對象銷毀;現(xiàn)在又無需考慮對象創(chuàng)建,對象的創(chuàng)建和銷毀都無需考慮了,這給編程帶來的影響是巨大的。
我們從一個簡單例子開始,有一個普通類B代碼如下:
public class B implements BI{
AInfterface a;
public B(AInfterface a){
this.a = a
}
public void invoke(){
/** ...*/
}
}
有兩種使用B的方式:
普通無Ioc容器的調用方式:
BI b = new B(new A());//需要在生成B實例之前 生成A等實例
b. invoke();
使用Ioc容器的革命調用方式:
BI b = (BI) WebAppUtil.getService(“b”);
b. invoke();
上面兩種方式重要區(qū)別:
前者需要照顧B類中A類的實例化,如果B類中調用不只A類一個,還有更多其他類如C/D/E等類,這樣,你在使用B類時,還需要研究其他類的創(chuàng)建,如果C/D/E這些類不是你自己編寫,你還需要翻閱它們的API說明,研究它們應該如何創(chuàng)建?是使用New 還是工廠模式 還是單態(tài)調用?
這時,你會感嘆:哇,有沒有搞錯?我只不過是為了使用B類中一個小小的方法,就花去我這么多時間和精力?
當我們使用第二種方式時,就無需花很多精力和時間考慮A/C/D/E等類的創(chuàng)建。
使用Ioc容器,你再也不必做這些僵化愚蠢的工作了,我們只需從ioc容器中抓取一個類然后直接使用它們。
當然,在使用之前,我們需要做一個簡單的配置,把你將來需要使用的類全部告訴ioc容器,例如Jdon框架的ioc容器配置jdonframework.xml如下:
<app> <services> <pojoService name="b" class="test.B"/> <pojoService name="a" class="test.A"/> <pojoService name="c" class="test.C"/> </services> </app>
注意:雖然B類代碼調用了A類(甚至可能調用C等其他類),但是在配置中我們無需考慮這種調用關系。因此,整個環(huán)節(jié)我們都無需考慮B類中涉及其他類的調用關系;這樣是非常省時省力的;特別是如果項目較大,JavaBeans特別多,又是多人協(xié)調開發(fā),這種方式對提高開發(fā)效率;降低出錯率是非常大的幫助。
如果你的項目中有非常多的類;調用關系很復雜,而且調用關系隨時都可能變化,那么,使用無需照顧調用關系的Ioc容器無疑是減輕開發(fā)負擔的首選。
ioc容器另外一個著名實現(xiàn)是Spring框架,但是在Spring的配置文件applicationContext.xml中,我們必須考慮上述調用關系:
<bean id="b" class="test.B"> <property name="a"><ref bean="a"/></property><!-- 必須指定調用關系 --> .... </bean> <bean id="a" class="test.A"> <bean id="c" class="test.C">
2. 缺點
IoC最大的缺點是什么?
生成一個對象的步驟變復雜了(其實上操作上還是挺簡單的),對于不習慣這種方式的人,會覺得有些別扭和不直觀。
對象 生成因為是使用反射編程,在效率上有些損耗。但相對于IoC提高的維護性和靈活性來說,這點損耗是微不足道的,除非某對象的生成對效率要求特別高。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot+JUnit5+MockMvc+Mockito單元測試的實現(xiàn)
今天聊聊如何在 SpringBoot 中集成 Junit5、MockMvc、Mocktio。Junit5 是在 Java 棧中應用最廣的測試框架,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
springmvc后臺基于@ModelAttribute獲取表單提交的數(shù)據(jù)
這篇文章主要介紹了springmvc后臺基于@ModelAttribute獲取表單提交的數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10
Spring注解@Configuration和@Component區(qū)別詳解
@Component和@Configuration都可以作為配置類,之前一直都沒覺得這兩個用起來有什么差別,可能有時程序跑的和自己想的有所區(qū)別也沒注意到,下面這篇文章主要給大家介紹了關于Spring注解@Configuration和@Component區(qū)別的相關資料,需要的朋友可以參考下2023-04-04
SpringBoot對接twilio實現(xiàn)郵件信息發(fā)送功能
這篇文章主要為大家詳細介紹了SpringBoot如何對接twilio實現(xiàn)郵件信息發(fā)送功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2025-03-03
Java如果通過jdbc操作連接oracle數(shù)據(jù)庫
這篇文章主要介紹了Java如果通過jdbc操作連接oracle數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
詳解SpringMVC組件之HandlerMapping(二)
這篇文章主要介紹了詳解SpringMVC組件之HandlerMapping(二),HandlerMapping組件是Spring?MVC核心組件,用來根據(jù)請求的request查找對應的Handler,在Spring?MVC中,有各式各樣的Web請求,每個請求都需要一個對應的Handler來處理,需要的朋友可以參考下2023-08-08

