使用spring等框架的web程序在Tomcat下的啟動順序及思路理清


大牛請繞過,此文僅針對自己小白水平,對web程序的啟動流程做個清晰的回顧。

一.使用spring等框架的web程序在Tomcat下的啟動流程

1)Tomcat是根據web.xml來啟動的。首先到web.xml

2)web.xml中負責啟動spring和spring mvc。對應的啟動配置文件分別是

啟動spring mvc,並進行所有資源路徑映射

<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/cfg/springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

啟動spring,通過ContextLoaderListener

     <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/cfg/spring.xml</param-value>
	</context-param>

3)spring中對一些orm框架的啟動,包括Mybatis/hibernate。orm框架的啟動基本都是通過sqlsessionFactory bean來啟動的。

    並配置各種bean到ioc容器中。包括datasource等。

 

4)web應用程序中,spring相當於程序運行的平台,spring對整個程序提高供ioc支持和aop支持。

spring提供注解如@service @repository @component將各種類注冊到ioc容器中。通過設置scan package的方式,spring在啟動時候會掃描包下的所有注解,並將它們注冊到ioc容器中。並針對@autowired @resource,將一些bean從ioc容器中獲取填充到bean的構造屬性中。

spring會自動掃描如下包中的注解:

<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>

以上可以看出spring所有的bean注入都是在spring.xml中配置的,所有的bean注入都在spring.xml中配置的。

@autowired @resource只針對於類的成員變量,不針對方法里的局部變量。

注:正是spring的ioc支持了controller層注入service,service注入dao。打通了各層之間的橋梁,省去了原來的new service(),new Dao()的方法。

 

問答

1.使用spring ioc有什么好處?

答:網上有很多介紹使用Spring IOC容器的好處的文章,我看到的主要有兩點, 
1.方便測試,當需要測試的類依賴其他的類時,可以為依賴的類做個mock,然后注入進來。 
2.方便維護及升級,當某個類需要修改實現時,只要接口沒變,則無需修改源代碼,重寫一個實現類,修改下配置即可。 

3.默認下,IOC容器管理的bean都是單例的,不會被gc掉。

4.spring提倡面向接口開發,因此在servcie里面的dao直接是接口就可以了。這樣有助於解耦。(測試等等)。。 

如果不用spring,要么自己new daoimpl,就面向具體了,如果還想抽象,就必須自己寫工廠——其實spring就是一個工廠IOC。實現類似的作用。 

其實,面向抽象是實現和接口分離,對於多數的項目,實現大量變化的機會不是很大,因此直接面向具體(省略掉dao接口等)是我個人推薦的做法。 

spring工廠對其中的對象的生命周期,作用范圍都有很明確的定義,很容易使用,如果自己做這么一套,只怕沒這么好。 

第三,spring對ioc管理的對象,可以做很多增強,比如aop,代理等等。 

5.感覺AOP最有用了。

 

2.spring是怎樣支持面向接口編程的?

由於依賴於接口,可以通過依賴注入隨時替換DAO接口的實現類,而應用程序完全不用了解接口與底層數據庫操作細節。

應用程序----調用-----》DAO接口《---實現--DAO接口實現類----操作------》數據庫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM