Action裏面調Service,Service裏面調DAO,在Action裏面new一個Service,在Service裏面new一個DAO。有了Spring以後能夠不用new對象了。AOP裏面有不少術語或者是思想是比較難理解的。除了這些以外呢就沒有什麼特別複雜的地方了。web
Spring3.2是Spring裏面最高的版本了。Spring的依賴包spring-framework-3.0.2.RELEASE-dependencies有不少東西,好比說c3p0,log4j,dbcp鏈接池等等。有不少很是很是多的內容,除了Spring以外的要用的內容基本均可以在這個依賴包裏面找到。Spring3.0.2提供了依賴包,可是往上升級的時候依賴包就沒有了,也就是說Spring3.0.2的依賴包已經足夠了。spring
UserService userService = new UserService();這樣的寫的話通常程序是不容易擴展的。由於在面向對象中最好不要直接new一個實現類,通常去面向接口編程。通常是爲這個實現類建立一個接口,面向接口編程。面向接口編程是可擴展性。假設UserService是接口,UserService userService = new UserServiceImpl();就很容易擴展了。編程
可是這種方式也不是很好.面向接口編程也不是很爽的.把程序具體的實現編寫到程序中,切換底層的實現,須要修改源代碼.形成程序:緊密耦合.什麼是緊密耦合?就是我在這裏每次想修改一個東西就須要修改程序的源代碼。spa
Java開發程序的OCP原則。OCP:open-close原則:擴展功能儘可能不要修改源程序,提供新的方法或者是屬性的形式擴展其功能.對擴展是開放的,對修改是關閉的.hibernate
使用工廠模式來進行擴展,不修改其源代碼。提供一個工廠類讓接口和具體實現類完成解耦。3d
工廠類的寫法以下:xml
public void BeanFactory{對象
public UserService getUserService(){//提供一個方法返回UserService.blog
return new UserServiceImpl();接口
}
}
這樣咱們在web層就能夠寫個UserService=或者是得到工廠類之後調用工廠類的方法。把程序與具體實現類的耦合轉成與工廠的耦合.與實現類完成解除耦合的形式.也就是說UserService與UserServiceImpl它倆之間就沒有了這種耦合的關係了.
有人說這樣也很差啊,雖然接口沒有與具體實現類耦合,可是它與工廠耦合了.你如今UserService userService 得先得到一個工廠。假設BeanFactory已經有了,BeanFactory factory = ...
//得到工廠
BeanFactory factory = ...
UserService userService = factory.getUserService();
這樣就變成了一個工廠的耦合。這樣也不併非特別的好。若是有了反射和配置文件,能夠這麼去作。
public class BeanFactory{
public UserService getUserService(){
//反射+配置文件
Class.forName(類名).new Instance();//直接生成一個類的實例,把這個實例一返回.
//在這裏讀取到類的全路徑就能夠了。
}
配置文件能夠是xml、properties(屬性文件).假設配置文件是屬性文件(properties),能夠這麼寫:
className = cn.itcast.service.UserServiceImpl
能夠讀到ClassName那個key找到裏面的內容把它放到Class.forName裏面就能夠生成對象實例把它返回了。這樣咱們每次再去修改這個內容的時候
不用去修改源代碼了。切換實現不須要修改源代碼了。
Spring IOC的底層原理=工廠+反射+配置文件。因此它的底層原理是提供一個工廠Bean,一個配置文件,把類全都配置到配置文件中,經過XML解析獲取到類的全路徑,從而反射得到一個類的實例。
這就是IOC容器底層原理的實現。
聲明式事務的管理,只須要你把事務一配置,就是你不須要手動地開啓事務或者是提交事務。在hibernate裏面本身去開啓事務或者是提交事務等等一系列的,這些你只要在Spring配置好以後你全部的DAO層、Service層不須要手動寫事務的代碼了。