struts2 spring hibernate執行流程

Struts2 Hibernate Spring 運行流程與部分機制
Tomcat容器被加載,找到該webApplication相對應的web.xml
開始解析web.xml中的信息

讀取到一個spring的監聽器,告訴spring容器開始初始化配置文件中的信息,spring容器配置文件默認applicationContext.xml
<listener>
<listener-class> org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

容器開始實例化spring相關bean和配置文件,
Spring容器建立dataSource數據源,
建立hibernate的sessionFactory(傳入dataSource)
建立操做數據庫所需的操做模板HibernateTemplate(傳入sessionFactory)
並掃描生成配置文件中的bean(IOC注入)
生成各個dao 傳入hibernateTemplate
生成各個service 傳入相對應的dao
(初始化工做完成,等待用戶的請求,只初始化spring容器中的bean)
spring容器初始化完成(若是action是prototype,不是單例的話)
action若是是單例就會先初始化action,service,dao,hibernateTemplate,sessionFactory,datasource)

一個請求發送到tomcat(產生了HttpServletRequest)
Tomcat接收到請求根據url尋找web application,開始加載該web application的web.xml
讀取到
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
的時候

1.經過filter過濾全部的url,調用把請求傳給StrutsPrepareAndExecuteFilter(前端控制器)
開始struts2的工做
struts2一塊兒動就會去加載配置文件,其中包括struts—plugin。xml讀取順序:

struts-default.xml
struts-plugin.xml
(struts2-spring-plugin.jar中的配置文件中的
<constant name="struts.objectFactory" value="spring" />,這句配置就指明瞭咱們產生struts對象的工廠交給spring來產生,若是action配置了註解,則交給spring在最初的時候產 生,若是沒有,則由struts2和plugin插件產生)
struts.xml
struts.properties
web.xml

2.StrutsPrepareAndExecuteFilter調用actionMapper來肯定是否
有action須要調用
3.若是actionMapper肯定請求須要調用某個action,那麼StrutsPrepareAndExecuteFilter
調用Dispatcher類中的serviceAction方法產生valuestack(值棧)與 actioncontext(action上下文)併產生actionproxy代理對象
把請求的處理交給actionProxy
4.actionProxy經過configurationManager查看struts.xml
來找到須要調用的action和action全部的配置信息(攔截器,轉換器等)
5.actionProxy建立一個actionInvocation的實例。
6.actionInvocation使用命令模式在action的先後來調用配置文件中
配置的攔截器和攔截器棧(好比將HttpServletRequest的參數解析出來封裝成對象傳給action)
(經過xml的代碼而後再解析xml文檔用dom解析或者sax解析,獲得xml的內容和節點,而後經過反射技術,進行java類的加載以及方法的加載 )
7.調用完攔截器後調用action對應的方法方法處理請求(頁面控制器)
8.由struts2生成action或者spring產生的,並struts-spring-plugin插件將action中所需的serviceImpl在spring容器中尋找並將實例傳入action(或者由工廠模式提供serviceImpl組件的實例)
9.action調用service,service調用dao
dao層中調用hibernateTemplate的相關方法完成數據庫操做將結果逐層返回給action
10.action返回試圖名
10.actionInvacation根據struts.xml中action返回的視圖名對應result的值尋找到對應的視圖將視圖和返回值結合(jsp拿到值)併產生新的jsp返回給上層的filter。
StrutsPrepareAndExecuteFilter將jsp返回給tomcat
Tomcat的jsp引擎(org.apache.jasper.servlet.JspServlet)生成serlvet源程序(.java文件)
.以後又將Servlet源程序編譯爲.class類文件;編譯成.class文件後返回給用戶產生html


一。Struts2生成action
不聲明@Component,由struts2生成的action(默認是prototype一個請求new一個)
action中須要訪問的service層的對象生成的set方法由struts-spring-plugin.jar這個jar包 幫咱們去spring容器中找與set方法名字同樣的bean幫咱們注入,
注意這裏struts-spring-plugin提供的注入方法是不可替換的,即便
使用@Resource指定其餘的實現也無效。


二。Spring生成action
由Spring容器生成的action,配置了@Component和@Scope("prototype")  struts,xml中action的class屬性指定成
@Component的value
該action中的service的set方法 須要使用@Resource注入,struts-spring-plugin 則不會自動去spring容器中尋找相應的bean


注意:
若是action不使用@Component("actionName") 那麼action是由struts2產生,若是加上@Component("u") 則struts.xml中的
<action name="u" class="u"> 的class要爲u,則爲spring產生的action,struts2找action的時候,去spring容器中找action

剛工做不久,本身總結的,若是錯誤以及不正確的地方,歡迎你們指正哈。  html

相關文章
相關標籤/搜索