1.非阻塞IO和阻塞IO的区别
在阻塞模式下,若从网络流读取不到指定大小的数据量,阻塞IO就在那里阻塞着。非阻塞IO模式下,若从网络流中读取不到指定大小的数据量,非阻塞IO就立即通行,其余字节等待来临再继续读取。
读的不同:没有数据到达的时候是否立即返回。
写的不同:阻塞情况下会一直到将数据写入操作系统才返回;非阻塞条件下则采用能写多少就写多少的策略。
2.进程间通信
- 共享内存:通常由一个进程创建,其余进程对这块内存区进行读写(有没有类似于Java的 volatile关键字)。共享内存区域是被多个进程共享的一部分物理内存。如果多个进程将内存区域映射到自己的虚拟存储地址空间,则这些进程都可以直接访问。
- 管道:管道是单向的、先进先出的、无结构的、固定大小的字节流。它将一个进程的标准输出和另一个进程的标准输入连接在一起。读写有点类似生产者-消费者。
- 消息队列:消息队列就是一个消息链表
3.IOC容器初始化过程
- BaseDefinition的Resource定位。BeanDefinition的资源定位由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用提供了统一接口。
- BaseDefinition的载入和解析,载入过程把用户定义好的Bean表示成IoC容器内部的数据结构,而这个容器内部的数据结构就是BeanDefinition,下面可以看到这个数据结构的详细定义。总地说来,这个BeanDefinition实际上就是POJO对象在IoC容器中的抽象,这个BeanDefinition定义了一系列的数据来使得IoC容器能够方便地对POJO对象也就是spring的Bean进行管理。即BeanDefinition就是Spring的领域对象。
refresh非常像重启容器,具体步骤如下图所示:
- BeanDefinition在IoC容器中的注册,这个过程是通过调用BeanDefinitionRegistry接口的实现来完成的,这个注册过程把载入过程中解析得到的BeanDefinition向IoC容器进行注册。可以看到,在IoC容器内部,是通过使用一个HashMap来持有这些BeanDefinition数据的。
值得注意的是,IoC容器和上下文的初始化一般不包含Bean依赖注入的实现。一般而言,依赖注入发生在应用第一次向容器通过getBean索取Bean时。但有一个例外值得注意,在使用IoC容器时有一个预实例化的配置,这个预实例化是可以配置的,具体来说可以通过在Bean定义信息中的lazyinit属性来设定;有了这个预实例化的特性,用户可以对容器初始化过程作一个微小的控制;从而改变这个被设置了lazyinit属性的Bean的依赖注入的发生,使得这个Bean的依赖注入在IoC容器初始化时就预先完成了。
(tips:在解析<Bean>元素过程中没有创建和实例化Bean对象,只是创建了Bean对象的定义类BeanDefinition,将<Bean>元素中的配置信息设置到BeanDefinition中作为记录,当依赖注入时才使用这些记录信息创建和实例化具体的Bean对象。)
4、AOP概念和实现
Aspect Oriented Programming 面向切面编程。解耦是程序员编码开发过程中一直追求的。AOP也是为了解耦所诞生。
具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。
AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能。最常见的就是事务控制。工作之余,对于使用的工具,不免需要了解其所以然。学习了一下,写了些程序帮助理解。
AOP 主要是利用代理模式的技术来实现的。具体详见本人文章AOP及其实现。
6.TCP/IP对应OSI七层模型的哪些层
- 应用层:应用层+表示层+会话层
- TCP:传输层
- IP:网络层
- 网络接口层(链路层):物理层
7.为什么三次握手和四次挥手
更详尽可以参照阿里技术之瞳上的图片。
8.Servlet生命周期
Servlet生命周期分为三个阶段:
- 1.初始化阶段,调用init()[整个生命周期只执行一次]。
- 2.响应客户请求阶段,调用Service()。
- 3.终止阶段,调用destroy()方法。
在下列时刻Servlet容器装载Servlet:
- 容器自动装载的某些Servlet
- Servlet容器启动后,客户首次向Servlet发送请求。
- Servlet类文件被更新后,重新装载Servlet
Servlet被装载后,Servlet容器创建一个Servlet实例,并调用init()方法进行初始化。在整个Servlet的整个生命周期,init()方法只被调用一次。
首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。
每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。
Servlet终止阶段:
当WEB应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet新实例时,Servlet容器会先调用Servlet的destroy()方法,在destroy()方法中可以释放掉Servlet所占用的资源。