Java 框架
上世紀90年代,使用Java開發Web應用普遍使用J2EE標准,J2EE具有平台無關性,對事務、消息等企業級的特性都有很好的支持,但當時的J2EE仍存在一些問題:
非常復雜:EJB的誕生是為了使Java EE的開發變得簡單,但是在當時它並沒有實現這個目標,完成一個組件需要配置許多的XML文件、本地接口、遠程接口等等。
組件依賴耦合:當一個組件依賴另一個組件時,它必須通過名稱自己查找依賴,而名稱是寫在代碼中的,就是所謂的“硬編碼”。
重量級:無論用戶是否需要,當時像集群、遠程調用等這些特性全部被支持,不得不去配置。這些使得程序變得非常臃腫,不靈活。
當時存在的這些問題就導致了市場上出現了各種各樣的Java 框架。比如現在被我們熟知的Spring Framework。
Spring
早在2002年的11月份,Rod Johnson 發表了一本名為《Expert One-on-One J2EE Design and Development》的書。這本書中就包含了Spring 框架代碼,最初這個框架叫做“Interface 21 framework”(直接取 com.interface21 包名),后來 Yann 提議命名為 Spring(春天),寓意 :Spring代表了一個新的開始,結束了傳統J2EE開發的“寒冬”。
Spring是一個用於Java企業開發,強大的輕量級應用開發框架。在某種程度上,Spring可以看做是框架的框架——它可以整合多種框架,如:Struts、Hibernate等,也就有了我們所熟知SSH(Struts+Spring+Hibernate)。Spring采用分層架構的設計,發展至今,已經包含了20多個模塊,不同的模塊有着不同的功能,可以選擇使用。
Core Container:容器包含了spring-core,spring-beans,spring-context,spring-context-support,spring-expression這五個模塊,包含IoC、DI核心特性。
AOP & Instrumentation:spring-aop提供了一個面向切面編程的實現,單獨的spring-aspects模塊提供與AspectJ框架的集成。
Messaging:spring-messaging 是Spring 4中新添加的模塊,為集成messaging api和消息協議提供支持。同樣也提供了一些映射消息到方法的注解,類似spring mvc注解。
Data Access/Integration:不難理解,為數據訪問層提供支持,包含JDBC, ORM,OXM, JMS 和 Transaction 模塊。
Web:包含spring-web,spring-webmvc, spring-websocket,和 spring-webmvc-portlet模塊。主要為Web開發提供支持。
Test:spring-test模塊使用JUnit或者TestNG為Spring各個組件提供單元測試與集成測試。
IoC & DI
控制反轉(Inversion of Control,IoC)是框架(framework)的公共特性,IoC可以認為是一種全新的設計模式,但是理論和時間成熟相對較晚,並沒有包含在GoF中。IOC體現了著名的The Hollywood principle-好萊塢原則:don’t call us, we’ll call you。為什么“控制反轉”是 frameworks的特性,我在 Framework VS Library 一文中做過簡單的分析。
實際上我們對於IOC設計模式很熟悉,還記得《大話設計模式》中大鳥教小菜如何應對數據庫更換嗎?可以參考我的另一篇文章:如何應對數據庫更換(三層架構+抽象工廠+反射+配置文件)。
傳統程序設計是在一個對象內部通過new創建它所依賴的對象,是程序員在代碼中控制對象的創建。這樣類與類之間就高度耦合了,程序變得非常不靈活,不易於復用。而有了IoC容器后,創建和查找依賴對象的控制權交到了容器手中,有容器注入依賴對象,對象與對象之間的關系變成了松耦合。那么這個IoC容器不就是我們熟悉的工廠嗎,抽象工廠+反射+配置文件就是控制反轉的一種實現。
控制反轉不等於依賴注入,他們是同一個概念不同角度的描述。僅僅講控制反轉,那么到底是哪些層面的控制被反轉了,所以使用IOC這個概念描述Spring等框架的特性就比較含糊。面向對象設計中大師級的人物Martin Fowler就此在他的 Inversion of Control Containers and the Dependency Injection pattern 博客文章中提出了依賴注入(Dependency Injection,DI)的概念。
IoC 告訴我們:容器控制對象,而 DI 告訴我們:被注入對象依賴IoC容器配置依賴對象。
轉自:https://www.sohu.com/a/198201231_826634