耦合是對模塊間關聯程度的度量,是影響軟件複雜程度和設計質量的一個重要因素,在設計上咱們應採用如下原則:若是模塊間必須 存在耦合,就儘可能使用數據耦合,少用控制耦合,限制公共耦合的範圍,儘可能避免使用內容耦合。java
依賴關係是必然存在的,是不可能完全消除的,咱們能作的只有儘可能下降依賴,有些依賴關係能夠經過優化代碼來解除的,請看下面的示例代碼:mysql
public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); }
上面的代碼表示:業務層調用持久層,而且此時業務層在依賴持久層的接口和實現類。若是此時沒有持久層實現類,編譯將不能經過。這種編譯期依賴關係,應該在咱們開發中杜絕,咱們須要優化代碼解決。spring
再好比,咱們的JDBC操做,註冊驅動時,咱們爲何不使用DriverManager的register 方法,而是採用Class.forName的方式?sql
public class JdbcDemo { public static void main(String[] args) throws Exception { //1.註冊驅動 //DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Class.forName("com.mysql.jdbc.Driver"); //2.獲取鏈接 //3.獲取預處理sql語句對象 //4.獲取結果集 //5.遍歷結果集 //6.關閉資源鏈接 } }
緣由就是咱們的類依賴了數據庫的具體驅動類(MySQL),若是這時候更換了數據庫品牌(好比 Oracle),須要修改源碼來從新數據庫驅動,這顯然不是咱們想要的。數據庫
拿鏈接JDBC案例來講,咱們消除類依賴的方式是經過反射來註冊驅動,從而避免了new關鍵字的使用,代碼以下:編程
//此處只是一個字符串 Class.forName("com.mysql.jdbc.Driver");
此時的好處是,咱們的類中再也不依賴具體的驅動類,此時就算刪除MySql的驅動jar包,依然能夠編譯(運行就不要想了,沒有驅動不可能運行成功的)。 同時,也產生了一個新的問題,MySql驅動的全限定類名字符串是在java類中寫死的,一旦要改仍是要修改 源碼。 解決這個問題也很簡單,使用配置文件配置。服務器
在實際的開發過程當中,咱們會將三層對象經過key/value的形式配置在xml文件中,當服務器啓動的時候,由工廠對象讀取這個xml文件,拿到配置好的三層對象的全限定類名,而後經過反射的方式逐個建立三層對象,並存放在容器中。而這個所謂的容器其實就是一個集合。這時候有Map和List供選擇。到底選Map仍是List就看咱們有沒有查找需求。有查找需求,選Map。至此,項目中的三層對象都交由工廠來建立並由工廠存儲到容器中了,當咱們須要使用到某個對象的時候,咱們就再也不須要經過new關鍵字獲取對象了,直接共工廠裏面取出來就好了,從而避免了new關鍵字的使用,達到了下降類之間耦合性的目的。框架
上述的工廠模式解耦思想其實就是Spring的IoC的解耦思想。在Spring中全部的類都會在spring容器中登記,Spring幫咱們把咱們配置的對象建立好,而後Spring會在咱們須要某個對象的時候,全部的類的建立、銷燬都由Spring來控制,也就是說控制對象生存週期的再也不是引用它的對象,而是spring。測試
Spring是於2003年興起的一個輕量級的Java開發框架,以 IoC(Inverse Of Control:反轉控制)和 AOP(Aspect Oriented Programming:面向切面編程)爲內核,提供了表示層SpringMVC和持久層SpringJDBC以及業務層事務管理等衆多的企業級應用技術,還能整合第三方框架和類庫,逐漸成爲JavaEE使用最多的應用開源框架。優化
經過Spring提供的IoC容器,能夠將對象間的依賴關係交由Spring進行控制,避免硬編碼所形成的過分程序耦合。用戶也沒必要再爲單例模式類、屬性文件解析等這些很底層的需求編寫代碼,可 以更專一於上層的應用。
只須要經過配置就能夠完成對事務的管理,而無需手動編程。
Spring提供面向切面編程,能夠方便的實現對程序進行權限攔截、運行監控等功能。
Spring整合了Junit4,能夠經過註解方便的測試Spring程序。
Spring能夠下降各類框架的使用難度,能夠方便的整合其餘優秀的框架。
Spring對JavaEE開發中很是難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使這些API應用難度大大下降。