spring讲解一:为什么tomcat可以运行SpringMvc项目?对比使用纯java代码 和 纯xml配置,如何启动SpringMvc项目。

为什么tomcat会调用java代码?tomcat和java代码是两个独立的个体,他们如何最后达到tomcat可以运行java代码的呢? 为什么tomcat运行的是Springmvc项目的代码?为什么现在的项目都离不开Springmvc?为什么不直接运行一个随意的main方法?为什么web应用框架有Springmvc和Struts2 ?  Springmvc和Struts2有什么共同点? 不知道答案的其实可以先猜一下试试。

答案:Servlet的规范,也可以说成是Servlet协议。


以前web项目都是必须用xml做配置,达到项目运行的效果,为什么现在可以不使用xml了?

答案:Servlet3.0的规范,2.5或者是以前的版本是不可以的,2.5版本以前,规定项目必须使用web.xml配置方式来运行代码。


为什么tomcat运行的是Springmvc项目的代码?没有随便运行一个main方法的代码?

答案:因为Springmvc框架遵守了Servlet规范,其中一条规范规定,在代码的根目录中(以spring框架为例,springmvc提供的jar包spring-web),必须有一个叫META-INF/services的目录且里面有一个全类路径名的文件(文件内容很简单:就是一个自定义的启动的类的全类名),而这个类中呢,必须有一个方法,名字叫:onStartup

到了这个时候,其实就明白了,原来tomcat启动,是直接去代码根目录找一个文件,然后根据文件里的内容,找到一个类,再运行这个类的一个叫onStartup方法,然后代码就开始一层一层的开始往下运行了。

其实不要springmvc也是可以的,不过就需要自己重新实现servlet的具体功能,对于开发来说,太麻烦,而且功能不一定能实现的这么全,这么好。

大家应该还记得,最开始学习java的时候,那时候的web项目可以说是非常的复杂,但是能够让你知道具体实现原理,现在框架封装太厚,如果想要了解,就算费尽九牛二虎之力,都不一定能清楚原理。特别是现在的springboot框架,用起来更加简单,但是很多原理几乎都隐藏了起来,但是万恶的面试官就喜欢问一些,对开发不太起作用的问题。

言归正传,以前的项目springmvc+spring+hibernate/mybaits项目,WEB-INF目录下有个web.xml文件

在spring3框架之前用的是Servlet3.0之前的规范,onStartup方法必须读取web.xml中的配置,进行初始化,spring3以后,就开始使用Servlet3.0规范,允许使用JavaConfig的方式(纯代码的方式),以前写在web.xml中内容,现在直接在onStartup方法中new,进行初始化,以前的名叫springmvc.xml、applicationContext-redis.xml类似这种名称的配置,现在直接用注解标记一个自定义的类,写好初始化的代码,就可以代替以前的配置文件了。

如果还记得web.xml的话,应该见过下面一段配置

<servlet>
    <servlet-name>springmvc_mybatis_annotation</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc/springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

里面有段配置:classpath:springmvc/springmvc.xml,就是说,运行onStartup方法后,遇到了new的DispatcherServlet后,就开始去找springmvc.xml这个文件,又再去初始化spring的其他集成配置。

现在springboot都不需要了,他把日常开发中,需要的配置,都帮你在springboot框架的java代码中写好了,程序员基本不用改了。

但是如果你想要改,不好意思,你又要去看springboot提供的官方文档(文档里有教你怎么集成redis、mysql等很多常用的组件),或者百度。

所以,如果你不想单纯的做一个码农,这个东西,你就必须要去了解。


为什么web应用框架有Springmvc和Struts2 ? 他们有什么共同点 ?

答案:因为他们两个web应用层框架都遵守了Servlet规范,他们都有相同的META-INF/services目录,都有自己实现的onStartup方法。他们都是封装了javax提供的servlet-api。也就是他们的底层都是servlet实现的。


 

其他解释:Servlet3.0的规范,是基于SPI的机制来实现的,

SPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。

说简单点,就是我规定你,下午3点在停车场的3号车位来接我,我下午3点会过来乘车。就两边都说好了,然后我们就可以进行交互了。

我们都知道,运行web项目,不光光是tomcat可以运行,还有weblogic、jetty、jboos等web容器(可以叫做web服务器)),因为tomcat免费,且性能还不错,所以被广泛运用。那为什么这些web服务器,就可以是web服务器了呢?那我随便写段代码为什么就成不了web服务器?

这里也就牵扯到Servlet其中的规范,也就是说,你要开发web服务器你要听我的,你要写web项目也必须听我的:

1. 你如果是运行java代码的web服务器(例:tomcat)运行之后,必须去代码的根目录下找META-INF/services文件夹并找到文件中的代码,运行代码中的onStartup方法。

2. “你”(例:springmvc框架)的代码想被呗运行,就必须有一个META-INF/services文件夹,和自己实现的onStartup的方法。


 

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