面试(二)

1.非阻塞IO和阻塞IO的区别

在阻塞模式下,若从网络流读取不到指定大小的数据量,阻塞IO就在那里阻塞着。非阻塞IO模式下,若从网络流中读取不到指定大小的数据量,非阻塞IO就立即通行,其余字节等待来临再继续读取。
读的不同:没有数据到达的时候是否立即返回。
写的不同:阻塞情况下会一直到将数据写入操作系统才返回;非阻塞条件下则采用能写多少就写多少的策略。

2.进程间通信

  • 共享内存:通常由一个进程创建,其余进程对这块内存区进行读写(有没有类似于Java的 volatile关键字)。共享内存区域是被多个进程共享的一部分物理内存。如果多个进程将内存区域映射到自己的虚拟存储地址空间,则这些进程都可以直接访问。
  • 管道:管道是单向的、先进先出的、无结构的、固定大小的字节流。它将一个进程的标准输出和另一个进程的标准输入连接在一起。读写有点类似生产者-消费者。
  • 消息队列:消息队列就是一个消息链表

3.IOC容器初始化过程

Spring容器
  • 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.为什么三次握手和四次挥手

TCP/IP三次握手和四次挥手

更详尽可以参照阿里技术之瞳上的图片。

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所占用的资源。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,492评论 11 349
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 16,697评论 1 133
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,628评论 18 399
  • Spring容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相...
    Theriseof阅读 7,831评论 1 24
  • 快乐没有永恒, 它只是多巴胺的多情。
    天山木兰阅读 1,058评论 0 0

友情链接更多精彩内容