大牛請繞過,此文僅針對自己小白水平,對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接口實現類----操作------》數據庫