1.spring:給軟件行業帶來了春天;
2.spring的理念:spring框架的初衷是使的現有的更加實用,spring不是創造輪子(技術或框架),而是使現有的輪子更好的運轉;spring本身是一個大雜燴,整合現有的框架技術;
3.Spring優點:
輕量級框架:不具備侵入性(使用某個框架,我們不需要實現它的某個接口,方便框架的替換,原有的代碼不需要替換);
Ioc容器:控制反轉;
Aop:面向切面編程;
對事務的支持;
對礦建的支持;
...................
4.主要內容:
從下向上看spring的主要內容:
Test:Spring支持Junit單元測試
核心容器(IOC):Bean(Bean工廠,創建對象)、Core(一切的基礎)、Context(上下文)、SpEL(Spring的表達式語言);
AOP:AOP、Aspects
對數據訪問的支持:JDBC、ORM、Transaction、JMS(java郵件服務)
對web的支持:Spring MVC
5.Ioc--inversion of control控制反轉:
首先引用一篇文章的內容,簡單了解一下DAO和Service層,Controller層、View層(http://www.jianshu.com/p/403acf6df656),另一篇文章http://www.cnblogs.com/xdp-gacl/p/4249939.html對Spring IOC設計思想的總結比較全面和通俗易懂;

1、Dao層 Dao層主要是做數據持久層的工作,負責與數據庫進行聯絡的一些任務都封裝在此,Dao層的設計首先是設計Dao的接口,然后在Spring的配置文件中定義此接口的實現類,然后就可在模塊中調用此接口來進行數據業務的處理,而不用關心此接口的具體實現類是哪個類,顯得結構非常清晰,Dao層的數據源配置,以及有關數據庫連接的參數都在Spring的配置文件中進行配置。 2、Service層 Service層主要負責業務模塊的邏輯應用設計。同樣是首先設計接口,再設計其實現的類,接着再Spring的配置文件中配置其實現的關聯。這樣我們就可以在應用中調用Service接口來進行業務處理。Service層的業務實現,具體要調用到已定義的Dao層的接口,封裝Service層的業務邏輯有利於通用的業務邏輯的獨立性和重復利用性,程序顯得非常簡潔。 3、Controller層 Controller層負責具體的業務模塊流程的控制,在此層里面要調用Service層的接口來控制業務流程,控制的配置也同樣是在Spring的配置文件里面進行,針對具體的業務流程,會有不同的控制器,我們具體的設計過程中可以將流程進行抽象歸納,設計出可以重復利用的子單元流程模塊,這樣不僅使程序結構變得清晰,也大大減少了代碼量。 4、View層 View層與控制層結合比較緊密,需要二者結合起來協同工作。View層主要負責網頁前台的Jsp頁面的表示。 文/睡在客廳里的人(簡書作者) 原文鏈接:http://www.jianshu.com/p/403acf6df656 著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。
鑒於上面文章中的介紹我們首先給出IOC(控制反轉)思想的代碼示例:
第一步:定義DAO接口UserDao
package cn.sxt.dao; //降低耦合性 public interface UserDao { public void getUser(); }
第二步:定義DAO接口的實現類UserDaoMysqlImpl和UserDaoOracleImpl
UserDaoMysqlImpl:
package cn.sxt.dao.impl; import cn.sxt.dao.UserDao; public class UserDaoMySqlImpl implements UserDao { @Override public void getUser(){ System.out.println("mysql獲取用戶數據"); } }
UserDaoOracleImpl:
package cn.sxt.dao.impl; import cn.sxt.dao.UserDao; public class UserDaoMySqlImpl implements UserDao { @Override public void getUser(){ System.out.println("mysql獲取用戶數據"); } }
第三步:定義Service層接口UserService,實現具體的業務
package cn.sxt.service; public interface UserService { public void getUser(); }
第四步:定義Service接口的實現類UserServiceImpl,Service層的業務實現,具體要調用到已定義的Dao層的接口
我們傳統的JavaSe設計思想,代碼是這樣組織的:我們直接在對象內部(應用程序本身)通過new進行創建對象,是程序主動去創建依賴對象
package cn.sxt.service.impl; import cn.sxt.dao.UserDao; import cn.sxt.service.UserService; public class UserServiceImpl implements UserService{ //直接依賴(耦合) private UserDao userDao=new UserDaoMySqlImpl(); @Override public void getUser(){ userDao.getUser(); } }
在我們的測試類Test(可以理解成客戶端)中
package cn.sxt.test; import cn.sxt.dao.impl.UserDaoMySqlImpl; import cn.sxt.dao.impl.UserDaoOracleImpl; import cn.sxt.service.impl.UserServiceImpl; //原來是在UserServiceImpl中創建Userdao對象(應用程序本身) //現在是客戶端(調用端)來創建 public class Test { public static void main(String args[]){ UserServiceImpl userService=new UserServiceImpl(); userService.getUser(); }
如果需要替換DAO接口的具體實現類的時候,我們需要將UserServiceImpl中的
private UserDao userDao=new UserDaoMySqlImpl();
修改為:
private UserDao userDao=new UserDaoOracleImpl();
控制反轉(IOC)的設計思想,我們不需要應用程序本身來創建對象,而是將創建對象的任務交付給IOC容器:此時,我們在UserServiceImpl可以這樣編寫代碼
package cn.sxt.service.impl; import cn.sxt.dao.UserDao; import cn.sxt.service.UserService; public class UserServiceImpl implements UserService{ //直接依賴(耦合) // private UserDao userDao=new UserDaoMySqlImpl(); //瞬間隔離開來 private UserDao userDao=null; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void getUser(){ userDao.getUser(); } }
添加一個set方法,當調用端需要創建對象的時候,創建具體實現類的對象,此時我們在Test類中就可以這樣組織代碼:
package cn.sxt.test; import cn.sxt.dao.impl.UserDaoMySqlImpl; import cn.sxt.dao.impl.UserDaoOracleImpl; import cn.sxt.service.impl.UserServiceImpl; //原來是在UserServiceImpl中創建Userdao對象(應用程序本身) //現在是客戶端(調用端)來創建 public class Test { public static void main(String args[]){ UserServiceImpl userService=new UserServiceImpl(); userService.setUserDao(new UserDaoMySqlImpl()); userService.getUser(); System.out.println("-----分割線------"); userService.setUserDao(new UserDaoOracleImpl()); userService.getUser(); } }
Test測試類運行結果:

mysql獲取用戶數據 -----分割線------ Oracle獲取用戶數據
通過上面的例子:
1).對象由原來程序本身創建,變為了程序接收對象
2).程序員主要精力集中與業務的實現
3).實現了service和dao的解耦工作,沒有直接依賴關系,層與層之間實現了分離(service和DAO沒有關系,完全分離)
4).如果dao的實現發生改變,應用程序本身不用改變(更改Spring的配置文件)