0.基础知识java
在idea中打开servlet的源码:程序员
能够看见servlet就是一个接口;接口就是规定了一些规范,使得一些具备某些共性的类都能实现这个接口,从而都遵循某些规范。web
有的人每每觉得就是servlet直接处理客户端的http请求,其实并非这样,servlet并不会去监听8080端口;直接与客户端打交道是“容器”,好比经常使用的tomcat。面试
客户端的请求直接打到tomcat,它监听端口,请求过来后,根据url等信息,肯定要将请求交给哪一个servlet去处理,而后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。spring
1. Servlet的生命周期数据库
从建立到毁灭:编程
init()
方法初始化service()
方法来处理客户端的请求destroy()
方法释放资源,标记自身为可回收
由上面能够看见,servlet的init方法和destroy方法,通常容器调用这两个方法之间的过程,就叫作servlet的生命周期。tomcat
调用的整个过程就如上图所示。安全
当请求来容器第一次调用某个servlet时,须要先初始化init(),服务器
但当某个请求再次打到给servlet时,容器会起多个线程同时访问一个servlet的service()方法。
由此能够看出,多个客户访问同一service()方法,会涉及线程安全的问题。
若是service()方法没有访问Servlet的成员变量也没有访问全局的资源好比静态变量、文件、数据库链接等,而是只使用了当前线程本身的资源,好比非指向全局资源的临时变量、request和response对象等。该方法自己就是线程安全的,没必要进行任何的同步控制。
若是service()方法访问了Servlet的成员变量,可是对该变量的操做是只读操做,该方法自己就是线程安全的,没必要进行任何的同步控制。
若是service()方法访问了Servlet的成员变量,而且对该变量的操做既有读又有写,一般须要加上同步控制语句。
若是service()方法访问了全局的静态变量,若是同一时刻系统中也可能有其它线程访问该静态变量,若是既有读也有写的操做,一般须要加上同步控制语句。
若是service()方法访问了全局的资源,好比文件、数据库链接等,一般须要加上同步控制语句。
面试问题:Servlet如何同时处理多个请求访问?
单实例多线程: 主要是请求来时,会由线程调度者从线程池李取出来一个线程,来做为响应线程。这个线程多是已经实例化的,也多是新建立的。
Servlet容器默认是采用单实例多线程的方式处理多个请求的:
1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例);
2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,能够经过servlet.xml的设置线程池中线程数目,初始化线程池经过web.xml,初始化每一个参数值等等。
3.当请求到达时,Servlet容器经过调度线程(Dispatchaer Thread) 调度它管理下线程池中等待执行的线程(Worker Thread)给请求者;
4.线程执行Servlet的service方法;
5.请求结束,放回线程池,等待被调用;
(注意:避免使用实例变量(成员变量),由于若是存在成员变量,可能发生多线程同时访问该资源时,都来操做它,照成数据的不一致,所以产生线程安全问题)
从上面能够看出:
第一:Servlet单实例,减小了产生servlet的开销;
第二:经过线程池来响应多个请求,提升了请求的响应时间;
第三:Servlet容器并不关心到达的Servlet请求访问的是不是同一个Servlet仍是另外一个Servlet,直接分配给它一个新的线程;若是是同一个Servlet的多个请求,那么Servlet的service方法将在多线程中并发的执行;
第四:每个请求由ServletRequest对象来接受请求,由ServletResponse对象来响应该请求;
2. Spring
任何Spring Web的entry point,都是servlet。
大名顶顶的spring框架已经风靡多时,一个事物的出现和流行都是会有缘由的,那么为何spring 框架会出现呢?缘由就是为了简化java开发。
spring的核心就是经过依赖注入、面向切面编程aop、和模版技术,解耦业务与系统服务,消除重复代码。借助aop,能够将遍及应用的关注点(如事物和安全)从它们的应用对象中解耦出来。
Spring 中的Bean
1) POJO和JavaBean的区别 :
"Plain Ordinary Java Object",简单普通的java对象。主要用来指代那些没有遵循特定的java对象模型,约定或者框架的对象。
POJO的内在含义是指那些:
有一些private的参数做为对象的属性,而后针对每个参数定义get和set方法访问的接口。
没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。
JavaBean 是一种JAVA语言写成的可重用组件。JavaBean符合必定规范编写的Java类,不是一种技术,而是一种规范。你们针对这种规范,总结了不少开发技巧、工具函数。符合这种规范的类,能够被其它的程序员或者框架使用。它的方法命名,构造及行为必须符合特定的约定:
全部属性为private。
这个类必须有一个公共的缺省构造函数。便是提供无参数的构造器。
这个类的属性使用getter和setter来访问,其余方法听从标准命名规范。
这个类应是可序列化的。实现serializable接口。
由于这些要求主要是靠约定而不是靠实现接口,因此许多开发者把JavaBean看做听从特定命名约定的POJO。
spring中,应用对西那个生存于spring容器中,spring 容器建立对象,装配它们,管理它们的整个生命周期。spring容器经过依赖注入,管理构成应用的组件,它会建立相互协做的组件之间的关联。
2) Bean的生命周期
Spring MVC
Spring MVC的运行流程: