Spring全解-01
Spring
理念:使現有技術更加實用,本身就是一個大雜燴,整合現有的框架技術。
官網:
官方下載地址:
GitHub:https://github.com/spring-projects
為什麼要使用spring
優點:
開源免費。
輕量級、非侵入式。
控制反轉IOC,面向切面AOP。
對事物的支援,對框架的支援。
......
一句話概括:Spring是一個輕量級的控制反轉和麵向切面的容器(框架)。
組成
Spring框架是一個分層結構,由七個定義良好的模組組成。Spring模組構建在核心容器之上,核心容器定義了建立、配置和管理bean的方式。
組成Spring框架的每個模組(或元件)都可以單獨存在,或者與其他一個或多個模組聯合實現。
單個模組介紹
核心容器(Spring Core):核心容器提供Spring框架的基本功能。核心容器的主要元件是BeanFactory,它是工廠模式的實現。BeanFactory使用控制反轉模式將應用程式的配置和依賴性規範與實際的應用程式程式碼分開。
Spring上下文(Spring Context):Spring上下文是一個配置檔案,向Spring框架提供上下文資訊。Spring上下文包括企業服務,例如JNDI、EJB、電子郵件、國際化、校驗和排程功能。
Spring AOP:通過配置管理特性,Spring AOP模組直接將面向切面的程式設計功能,整合到了Spring框架中。所以,可以很容易的使Spring框架管理任何支援AOP的物件。Spring AOP模組為基於 spring的應用程式中的物件提供了事務管理服務。通過使用SpringAOP,不用依賴元件,就可以將宣告性事務管理整合帶應用程式中。
Spring DAO:JDBC DAO抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同資料庫供應商丟擲的錯誤資訊。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常程式碼數量(例如開啟和關閉連線)。Spring DAO 的面向JDBC的異常遵從通用的DAO異常層次結構。
Spring ORM:Spring框架插入了若干個ORM框架,從而提供了ORM的物件關係工具,其中包括JDO、Hibernate和iBtis SQL Map。所有這些都遵從spring的通用事務和DAO異常層次結構。
Spring Web模組:Web上下文模組建立在應用程式上下文模組之上,為基於Web的應用程式提供了上下文。所以,Spring框架支援與Jakarta Struts的整合。Web模組還簡化了處理多部分請求一級將請求引數繫結到域物件的工作。
Spring MVC框架:MVC框架是一個全功能的構建Web應用程式的MVC實現。通過策略介面,MVC框架變成為高度可配置的,MVC容納了大量檢視技術,其中包括JSP、Velocity、Tiles、iText和POI。
IOC理論推導
public interface UserDao { public void getUser(); }
public class UserDaoImpl implements UserDao { @Override public void getUser() { System.out.println("獲取使用者資料"); } }
public interface UserService { public void getUser(); }
public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); @Override public void getUser() { userDao.getUser(); } }
@Test public void test(){ UserService service = new UserServiceImpl(); service.getUser(); }
這是傳統的呼叫模式,但是這只是在介面只有一個實現類的情況下。如果一個介面有多個實現類呢,那我們每次都需要去service裡修改接口裡面的實現類嗎?
public class UserDaoMySqlImpl implements UserDao { @Override public void getUser() { System.out.println("MySql獲取使用者資料"); } }
public class UserDaoOracleImpl implements UserDao { @Override public void getUser() { System.out.println("Oracle獲取使用者資料"); } }
public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoMySqlImpl(); @Override public void getUser() { userDao.getUser(); } }
這種情況下,每次都要在Service裡修改 new 的實現類,不符合程式碼的設計需求。
解決方法
不要寫死 new 的實現類,而是留下一個介面,利用裡面的set方法,由使用者來選擇傳遞進去的實現類是什麼。
public class UserServiceImpl implements UserService { private UserDao userDao; // 利用set實現 public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void getUser() { userDao.getUser(); } }
@Test public void test(){ UserServiceImpl service = new UserServiceImpl(); service.setUserDao( new UserDaoMySqlImpl() ); service.getUser(); //那我們現在又想用Oracle去實現呢 service.setUserDao( new UserDaoOracleImpl() ); service.getUser(); }
區別
上面的程式碼都是寫死的,接口裡面的實現類事先就寫好了,東西都是由程式去進行控制。但是現在我們沒有寫死接口裡面的實現類,而是留下介面,實現類的建立權交給了使用者,把主動權交給了呼叫者,程式不再去管怎麼建立實現了,它只負責提供一個介面。即:所謂的控制反轉就是,獲取依賴物件的方式反轉了,由程式變成了呼叫者。
IOC本質
控制反轉(Inversion of Control),是一種設計思想,DI(依賴注入)是實現IOC的一種方法。
IOC 是Spring框架的核心內容,使用多種方式完美的實現了ioc,可以使用xml配置,也可以使用註解,新版本的Spring也可以零配置實現ioc。
Spring容器在初始化時先讀取配置檔案,根據配置檔案或元資料建立與組織物件存入容器中,程式使用時再從ioc容器中取出需要的物件。
通過xml方式配置bean的時候,Bean的定義資訊是和實現分離的,而採用註解的方式可以把兩者合為一體,Bean的定義資訊直接以註解的形式定義在實現類中,從而達到了零配置的目的。
總結
控制反轉是一種通過描述(xml或註解)並通過第三方去生產或獲取特定物件的方式。在Spring中實現控制反轉的是IOC容器,其實現方法是依賴注入。