Struts,Hibernate,spring工作機制

轉 http://write.blog.csdn.net/postedit?ref=toolbar

Hibernate工作原理及爲什麼要用?
原理:
1. 讀取並解析配置文件
2. 讀取並解析映射信息,創建SessionFactory
3. 打開Sesssion
4. 創建事務Transation
5. 持久化操作
6. 提交事務
7. 關閉Session
8. 關閉SesstionFactory
爲什麼要用:
* 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。
* Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作
* hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。
* hibernate的性能非常好,因爲它是個輕量級框架。映射的靈活性很出色。它支持各種關係數據庫,從一對一到多對多的各種複雜關係。
Hibernate是如何延遲加載?
* Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)
* Hibernate3 提供了屬性的延遲加載功能
當Hibernate在查詢數據的時候,數據並沒有存在與內存中,當程序真正對數據的操作時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提高了服務器的性能。
Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係)
類與類之間的關係主要體現在表與表之間的關係進行操作,它們都市對對象進行操作,我們程序中把所有的表與類都映射在一起,它們通過配置文件中的many-to-one、one-to-many、many-to-many、
說下Hibernate的緩存機制

工作機制:
Struts的工作流程:
在web應用啓動時就會加載初始化ActionServlet,ActionServlet從struts-config.xml文件中讀取配置信息,把它們存放到各種配置對象當ActionServlet接收到一個客戶請求時,將執行如下流程.
(1)檢索和用戶請求匹配的ActionMapping實例,如果不存在,就返回請求路徑無效信息;
(2)如果ActionForm實例不存在,就創建一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中;
(3)根據配置信息決定是否需要表單驗證.如果需要驗證,就調用ActionForm的validate()方法;
(4)如果ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功;
(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發給哪個Action,如果相應的Action實例不存在,就先創建這個實例,然後調用Action的execute()方法;
(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發給ActionForward對象指向的JSP組件;
(7)ActionForward對象指向JSP組件生成動態網頁,返回給客戶;
爲什麼要用:
JSP、Servlet、JavaBean技術的出現給我們構建強大的企業應用系統提供了可能。但用這些技術構建的系統非常的繁亂,所以在此之上,我們需要一個規則、一個把這些技術組織起來的規則,這就是框架,Struts便應運而生。
基於Struts開發的應用由3類組件構成:控制器組件、模型組件、視圖組件
Struts的validate框架是如何驗證的?
在struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調用。
說下Struts的設計模式
MVC模式: web應用程序啓動時就會加載並初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被創建,並被填入表單相應的數據,ActionServler根據Struts-config.xml 文件配置好的設置決定是否需要表單驗證,如果需要就調用ActionForm的Validate()驗證後選擇將請求發送到哪個Action,如果 Action不存在,ActionServlet會先創建這個對象,然後調用Action的execute()方法。Execute()從 ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給 ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動態的網頁,返回給客戶。
單例模式
Factory(工廠模式):
定義一個基類===》實現基類方法(子類通過不同的方法)===》定義一個工廠類(生成子類實例)
===》開發人員調用基類方法
Proxy(代理模式)
spring工作機制及爲什麼要用?
1.spring mvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模塊負責負責對請求進行真正的處理工作。
2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
3.DispatcherServlet請請求提交到目標Controller
4.Controller進行業務邏輯處理後,會返回一個ModelAndView
5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
6.視圖對象負責渲染返回給客戶端。
爲什麼用:
AOP 讓開發人員可以創建非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP 後,公共服務 (比 如日誌、持久性、事務等)就可以分解成方面並應用到域對象上,同時不會增加域對象的對象模型的複雜性。
IOC 允許創建一個可以構造對象的應用環境,然後向這些對象傳遞它們的協作對象。正如單詞 倒置 所表明的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每一個對象都是用 其協作對象構造的。因此是由容器管理協作對象(collaborator)。
Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協作對象)。然後可以很容易地在需要時替換具有類似接口的協作對象。
* 一些spring與hibernate的面試題
1、 簡述你對IoC(Inversion of Control)的理解,描述一下Spring中實現DI(Dependency Injection)的幾種方式。
2、 Spring的Bean有多種作用域,包括:
singleton、prototype、request、session、global session、application、自定義
3、 簡單描述Spring framework與Struts的不同之處,整合Spring與Struts有哪些方法,哪種最好,爲什麼?
4、 Hibernate中的update()和saveOrUpdate()的區別
5、 Spring對多種ORM框架提供了很好的支持,簡單描述在Spring中使用Hibernate的方法,並結合事務管理。
答案:
1、好萊塢原則€€€€不要打電話找我,我會打給你的。IoC將創建的職責從應用程序代碼搬到了框架中。Spring對Setter注入和構造方法注入提供支持。(詳見http://martinfowler.com/articles/injection.html,以及http: //www.redsaga.com/spring_ref/2.0/html/beans.html#beans-factory- collaborators)
2、 除application(詳見Spring framework 2.0 Reference的3.4節bean的作用域)
3、 Spring是完整的一站式框架,而Struts僅是MVC框架,且着重於MVC中的C。Spring有三種方式整合Struts:使用 Spring 的 ActionSupport 類整合 Struts;使用 Spring 的 DelegatingRequestProcessor 覆蓋 Struts 的 RequestProcessor;將 Struts Action 管理委託給 Spring 框架,動作委託最好。(詳見使用Spring 更好地處理Struts 動作)
Spring 2.0新增一種方式:AutowiringRequestProcessor。(詳見http://www.javaeye.com/topic/24239)
4、 saveOrUpdate()方法可以實現update()的功能,但會多些步驟,具體如下:
如果對象在該session中已經被持久化,不進行操作;
對象的標識符屬性(identifier property)在數據庫中不存在或者是個暫時的值,調用save()方法保存它;
如果session中的另一個對象有相同的標識符拋出一個異常;
以上皆不符合則調用update()更新之。
5、 在context中定義DataSource,創建SessionFactoy,設置參數;DAO類繼承HibernateDaoSupport,實現具體接口,從中獲得HibernateTemplate進行具體操作。
在使用中如果遇到OpenSessionInView的問題,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor。(詳見Spring framework 2.0 Reference的12.2節Hibernate)
聲明式事務需聲明事務管理器,在context中設置指定屬性,用確定和。
* 在spring中如何更加高效的使用JDBC
使用Spring框架提供的模板類JdbcTemplete可以是JDBC更加高效
代碼如下:JdbcTemplate template = new JdbcTemplate(myDataSource);
DAO類的例子:
public class StudentDaoJdbc implements StudentDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
more..
}
配置文件:




* 在spring如何創建一個數據連接池

${db.driver} ${db.url} ${db.username} ${db.password} 
* 在spring中如何配置一個bean來從JNDI到dataSource

java:comp/env/jdbc/myDatasource 
* 請介紹下spring中bean的作用域
在spring2.0之前bean只有2種作用域即:singleton(單例)、non-singleton(也稱 prototype),Spring2.0以後,增加了session、request、global session三種專用於Web應用程序上下文的Bean。因此,默認情況下Spring2.0現在有五種類型的Bean。

這裏的scope就是用來配置spring bean的作用域,它標識bean的作用域。
在spring2.0之前bean只有2種作用域即:singleton(單例)、non-singleton(也稱 prototype),Spring2.0以後,增加了session、request、global session三種專用於Web應用程序上下文的Bean。因此,默認情況下Spring2.0現在有五種類型的Bean。當然,Spring2.0對 Bean的類型的設計進行了重構,並設計出靈活的Bean類型支持,理論上可以有無數多種類型的Bean,用戶可以根據自己的需要,增加新的Bean類型,滿足實際應用需求。
1、singleton作用域
當一個bean的作用域設置爲singleton,那麼Spring IOC容器中只會存在一個共享的bean實例,並且所有對bean的請求,只要id與該bean定義相匹配,則只會返回bean的同一實例。換言之,當把一個bean定義設置爲singleton作用域時,Spring IOC容器只會創建該bean定義的唯一實例。這個單一實例會被存儲到單例緩存(singleton cache)中,並且所有針對該bean的後續請求和引用都將返回被緩存的對象實例,這裏要注意的是singleton作用域和GOF設計模式中的單例是完全不同的,單例設計模式表示一個ClassLoader中只有一個class存在,而這裏的singleton則表示一個容器對應一個bean,也就是說當一個bean被標識爲singleton時候,spring的IOC容器中只會存在一個該bean。
配置實例:

或者

2、prototype
prototype作用域部署的bean,每一次請求(將其注入到另一個bean中,或者以程序的方式調用容器的getBean()方法)都會產生一個新的bean實例,相當於一個new的操作,對於prototype作用域的bean,有一點非常重要,那就是Spring不能對一個 prototype bean的整個生命週期負責,容器在初始化、配置、裝飾或者是裝配完一個prototype實例後,將它交給客戶端,隨後就對該prototype實例不聞不問了。不管何種作用域,容器都會調用所有對象的初始化生命週期回調方法,而對prototype而言,任何配置好的析構生命週期回調方法都將不會被調用。清除prototype作用域的對象並釋放任何prototype bean所持有的昂貴資源,都是客戶端代碼的職責。(讓Spring容器釋放被singleton作用域bean佔用資源的一種可行方式是,通過使用 bean的後置處理器,該處理器持有要被清除的bean的引用。)
配置實例:

或者

3、request
request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效,配置實例:
request、session、global session使用的時候,首先要在初始化web的web.xml中做如下配置:
如果你使用的是Servlet 2.4及以上的web容器,那麼你僅需要在web應用的XML聲明文件web.xml中增加下述ContextListener即可:

org.springframework.web.context.request.RequestContextListener …

如果是Servlet2.4以前的web容器,那麼你要使用一個javax.servlet.Filter的實現:

..

requestContextFilter
org.springframework.web.filter.RequestContextFilter


requestContextFilter
/*



接着既可以配置bean的作用域了:

4、session
session作用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效,配置實例:
配置實例:
和request配置實例的前提一樣,配置好web啓動文件就可以如下配置:

5、global session
global session作用域類似於標準的HTTP Session作用域,不過它僅僅在基於portlet的web應用中才有意義。Portlet規範定義了全局Session的概念,它被所有構成某個 portlet web應用的各種不同的portlet所共享。在global session作用域中定義的bean被限定於全局portlet Session的生命週期範圍內。如果你在web中使用global session作用域來標識bean,那麼,web會自動當成session類型來使用。
配置實例:
和request配置實例的前提一樣,配置好web啓動文件就可以如下配置:

6、自定義bean裝配作用域
在spring 2.0中作用域是可以任意擴展的,你可以自定義作用域,甚至你也可以重新定義已有的作用域(但是你不能覆蓋singleton和 prototype),spring的作用域由接口org.springframework.beans.factory.config.Scope來定義,自定義自己的作用域只要實現該接口即可,下面給個實例:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章