Offer来了:Java面试核心知识点精讲(框架篇)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-17 22:44:31

点击下载

作者:王磊

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Offer来了:Java面试核心知识点精讲(框架篇)

Offer来了:Java面试核心知识点精讲(框架篇)试读:

前言

本书是对Java程序员面试中常见的微服务、网络编程、分布式存储和分布式计算等必备知识点的总结,包括Spring原理及应用、Spring Cloud原理及应用、Netty网络编程原理及应用、ZooKeeper原理及应用、Kafka原理及应用、Hadoop原理及应用、HBase原理及应用、Cassandra原理及应用、ElasticSearch原理及应用、Spark原理及应用、Flink原理及应用。希望读者能通过阅读本书对微服务、网络编程和分布式系统有更深入、系统和全面的理解。

面试官通常会在短短两小时内对面试者的知识结构进行全面了解,面试者在回答问题时如果拖泥带水且不能直击问题的本质,则很难充分表现自己,最终影响面试结果。针对这种情况,本书对Java分布式架构中常用的技术做了梳理和总结,在介绍知识点时重点介绍原理,同时辅以示例。本书在讲解知识点时不拖泥带水,力求精简,用115张原理图和流程图以非常直观的方式对Java程序员面试时常被问及的分布式架构核心知识点进行介绍。章节架构

本书共11章,各章所讲内容如下。

第1章讲解Spring原理及应用,涉及Spring原理、Spring注解、Spring IoC原理、Spring AOP原理、Spring MVC原理、事务、MyBatis缓存等内容。

第2章讲解Spring Cloud原理及应用,涉及Spring Boot、Spring Cloud Config、Eureka、Consul、Hystrix、Zuul和Spring Cloud链路监控等内容。

第3章讲解Netty网络编程原理及应用,涉及Reactor线程模型、Netty架构、Netty特性和Netty使用等内容。

第4章讲解ZooKeeper原理及应用,涉及ZooKeeper原理、ZooKeeper选举机制、ZooKeeper数据模型和ZooKeeper应用场景等内容。

第5章讲解Kafka原理及应用,涉及Kafka原理、Kafka组成、Kafka数据存储设计、Kafka生产者并发设计、Kafka消费者并发设计,以及Kafka安装和应用等内容。

第6章讲解Hadoop原理及应用,涉及HDFS、MapReduce、YARN等内容。

第7章讲解HBase原理及应用,涉及列式存储、HBase列式存储数据模型、HBase架构组成和HBase数据读写流程等内容。

第8章讲解Cassandra原理及应用,涉及Cassandra数据模型、Gossip协议、NWR理论、一致性Hash、Cassandra数据副本策略和读写机制等内容。

第9章讲解ElasticSearch原理及应用,涉及ElasticSearch数据模型、ElasticSearch分布式架构、ElasticSearch数据读写原理和段合并等内容。

第10章讲解Spark原理及应用,涉及Spark特点、Spark模块组成、Spark运行机制,以及Spark RDD、Spark Streaming、Spark SQL、DataFrame、DataSet、Spark Structured Streaming的原理和使用等内容。

第11章讲解Flink原理及应用,涉及Flink核心概念、Flink架构、Flink事件驱动模型、Flink数据分析应用和Flink基于状态的内存计算等内容。阅读建议

本书目录细致,建议读者在阅读本书后以原理图和流程图为依据、以目录为参考温故而知新,达到融会贯通的目的。建议读者花4周进行细读,详细理解书中的知识点、代码和架构图,在每个章节阅读完成后都手绘原理图和流程图;在细读完成后再花5天进行复习,对照手绘的原理图回忆知识点,针对想不起来的知识点及时查漏补缺;在面试前再花3小时进行复习,以充分掌握本书知识点。这样,读者对书中每个知识点的广度和深度的理解就会更充分,在面试时可以胸有成竹、百战不殆。致谢

感谢电子工业出版社博文视点的张国霞编辑,她的鼓励和引导对本书的写作和出版有很大的帮助,同时感谢李秀梅编辑对本书的细致编辑;感谢王晓东,是他关注并向编辑提出了本书的出版价值。

写技术书籍是很耗费精力的,笔者常常因为一行代码或者一张图能否准确表达含义而思考再三。出于工作的原因,笔者只能在晚上和周末写作,写作难度很大,所以十分感谢妻子张艳娇女士,没有她的鼓励和支持,本书很难顺利出版;也十分感谢家人和朋友在工作和生活中对笔者的关心和帮助。在这里,衷心地祝愿大家身体健康,万事如意。读者服务

扫码回复:38667

·获取博文视点学院20元优惠券

·获取免费增值资源

·加入本书读者交流群,与本书作者互动

·获取精选书单推荐第1章 Spring原理及应用

Spring是一个企业级J2EE应用开发一站式解决方案,其提供的功能贯穿了项目开发的表现层、业务层和持久化层,同时,Spring可以和其他应用框架无缝整合。大部分Java开发人员在项目中均使用到了Spring技术,但是在使用过程中,有很多开发人员认为“程序run起来就ok了”,容易忽略其原理。本章将详细介绍常用的Spring核心技术背后的原理。1.1 Spring的特性

Spring基于J2EE技术实现了一套轻量级的Java Web Service系统应用框架。它有很多优秀的特性,很多公司都选择把Spring作为产品或项目的基础开发架构。Spring的特性包括轻量、控制反转(Inversion of Control,IoC)、面向容器、面向切面(Aspect Oriented Programming,AOP)和框架灵活,具体如图1-1所示。图1-1 Spring的特性1.1.1 轻量

从JAR包的大小上来说,Spring是一个轻量级的框架,其核心JAR包spring-web-5.2.0.RELEASE.jar和spring-core-5.2.0.RELEASE.jar的大小均为1.4MB左右;从系统的资源使用上来说,Spring也是一个轻量级的框架,其运行期间只需要少量的操作系统资源(内存和CPU)便能稳定运行。除此之外,Spring还是模块化的,应用程序在使用过程中可以根据需求引入模块(以JAR包依赖方式引入)来实现不同的功能,使其应用更加灵活。1.1.2 控制反转

Spring的控制反转指一个对象依赖的其他对象将会在容器的初始化完成后主动将其依赖的对象传递给它,而不需要这个对象自己创建或者查找其依赖的对象。Spring基于控制反转技术实现系统对象之间依赖的解耦。1.1.3 面向容器

Spring实现了对象的配置化生成和对象的生命周期管理,因此,可以理解为其是面向容器的。通过Spring的XML文件或者注解方式,应用程序可以配置每个Bean对象被创建和销毁的时间,以及Bean对象创建的先后顺序和依赖关系。Spring中的实例对象可以是全局唯一的单例模式,也可以在每次需要时都重新生成一个新的实例,具体以哪种方式创建Bean对象由Bean的生命周期决定,通过prototype属性来定义。1.1.4 面向切面

Spring提供了面向切面的编程支持,面向切面技术通过分离系统逻辑和业务逻辑来提高系统的内聚性。在具体的使用过程中,业务层只需要关注并实现和业务相关的代码逻辑,而不需要关注系统功能(例如系统日志、事务支持)和业务功能的复杂关系,Spring通过面向切面技术将系统功能自动织入业务逻辑的关键点。1.1.5 框架灵活

基于容器化的对象管理技术,Spring中的对象可以被声明式地创建,例如通过XML文件或注解的方式定义对象和对象之间的依赖关系。Spring作为一个轻量级的J2EE Web框架,具有事务管理、持久化框架集成和Java Web服务等功能,应用程序可以根据需求引入相应的模块,以实现不同的功能。1.2 Spring的模块

Spring为企业应用程序提供一站式服务。Spring是模块化的,允许应用按需引入各个模块。Spring提供的常用模块有核心容器层(Core Container)、数据访问层(Data Access)、Web应用层(Web Access)。除此之外,Spring还包括AOP、Aspects、Instrumentation、Messaging和Test。Spring的模块如图1-2所示。下面对Spring中各个核心的模块做简单的介绍。图1-2 Spring的模块1.2.1 核心容器层

核心容器层由Spring-Beans、Spring-Core、Spring-Context和SpEL(Spring Expression Language,Spring表达式语言)等模块组成。1.Spring-Beans

Spring-Beans模块基于工厂模式实现对象的创建。Spring-Beans通过XML配置文件实现了声明式的对象管理,将对象之间复杂的依赖关系从实际编码逻辑中解耦出来。2.Spring-Core

Spring-Core模块是Spring的核心功能实现,具体包括控制反转和依赖注入。所谓依赖注入,是指在一个Bean实例中引用另外一个Bean实例时,Spring容器会自动创建其所依赖的Bean实例,并将该Bean实例注入(传递)到对应的Bean中。3.Spring-Context

Spring-Context模块是在Spring-Beans和Spring-Core模块的基础上构建起来的。Spring-Context模块继承自Spring-Beans模块,并且添加了国际化、事件传播、资源加载和透明地创建上下文等功能。

同时,Spring-Context模块提供了一些J2EE的功能,比如EJB、JMX和远程调用等。ApplicationContext接口是Spring-Context模块操作Bean的入口。

Spring-Context-Support提供了将第三方库集成到Spring-Context的支持,比如缓存(EhCache、Guava、JCache)、邮件(JavaMail)、调度(CommonJ、Quartz)和模板引擎(FreeMarker、JasperReports、Velocity)等。4.SpEL

SpEL模块提供了丰富的表达式语言支持,用于在运行过程中查询和操作对象实例。SpEL在JSP 2.1表达式语言规范的基础上进行了扩展,支持set方法、get方法、属性赋值、方法调用、访问数组集合、索引内容、逻辑算术运算、命名变量、基于名称在Spring IoC容器检索对象,同时支持列表的投影、选择和聚合等功能。1.2.2 数据访问层

数据访问层包括JDBC、ORM、OXM、JMS和事务处理模块。它们的术语描述如表1-1所示。表1-1 Spring数据访问层的术语描述1.JDBC

JDBC模块提供了JDBC抽象层。Spring持久化层基于JDBC抽象层实现了在不同数据库之间灵活切换,而不用担心不同数据库之间SQL语法的不兼容。2.ORM

ORM模块提供了对象关系映射API的集成,包括JPA(Java Persistence API)、JDO(Java Data Object)和Hibernate等。基于该模块,ORM框架能很容易地和Spring的其他功能(例如事务管理)整合。3.OXM

OXM 模块提供了对OXM实现的支持,比如JAXB、Castor、XML Beans、JiBX、XStream等。4.JMS

JMS 模块包含消息的生产(Produce)和消费(Consume)功能。从Spring 4.1开始,Spring集成了Spring-Messaging模块,用于实现对消息队列的支持。5.事务处理

事务处理(Transactions)模块基于接口方式实现了声明式事务管理。编程式事务的实现需要应用程序调用相应的beginTransaction()、commit()、rollback()等方法来实现事务的管理,Spring声明式事务只需要通过注解或配置即可实现事务的管理,具体的事务管理工作由Spring自动处理,应用程序不需要关心事务的提交(Commit)和回滚(Rollback)。1.2.3 Web应用层

Web应用层主要包含Web交互和数据传输等相关功能,由Web、Web-MVC、Web-Socket、Web-Portlet组成。1.Web

Web模块不但提供了面向Web应用的基本功能,还提供了HTTP(Hyper Text Transfer Protocol,超文本传输协议)客户端及Spring远程调用中与Web相关的部分。Web模块基于Servlet监听器初始化IoC容器。2.Web-MVC

Web-MVC模块为Web应用提供了模型视图控制(Model View Controller,MVC)和REST API服务的实现。Spring的MVC框架使数据模型和视图分离,数据模型负责数据的业务逻辑,视图负责数据的展示。同时,Web-MVC可与Spring框架的其他模块方便地集成。3.Web-Socket

Web-Socket模块提供了对WebSocket-Base的支持,用于实现在Web应用程序中服务端和客户端实时双向通信,尤其在实时消息推送中应用广泛。4.Web-Portlet

Web-Portlet模块提供了基于Portlet环境的MVC实现,并提供了与Spring Web-MVC模块相关的功能。1.2.4 其他重要模块

除了上述介绍的模块,Spring还有其他一些重要的模块,例如,AOP、Aspects、Instrumentation、Messaging和Test等。1.AOP

AOP模块提供了面向切面的编程实现,允许应用程序通过定义方法拦截器和切入点来实现系统功能和业务功能之间的解耦。2.Aspects

Aspects模块提供了Spring与AspectJ的集成,是一个面向切面编程的模块。3.Instrumentation

Instrumentation模块在应用中提供了对Instrumentation的支持和类加载器的实现。4.Messaging

Messaging模块为STOMP(Simple Text Orientated Messaging Protocol,简单文本定向消息协议)提供了支持,主要用于应用程序中WebSocket子协议的实现。同时,Messaging模块可通过注解的方式来选择和处理来自WebSocket客户端的STOMP消息。5.Test

Test(测试)模块用于对JUnit或TestNG等测试框架提供支持,以实现Spring代码的自动化测试。1.3 Spring的核心JAR包

Spring基于模块化实现,每个模块都对应不同的JAR包。要全面了解Spring,首先应从JAR包开始,但是Spring JAR包众多,每个包中又都含有复杂的技术原理,鉴于篇幅原因,表1-2对常用的JAR包和功能做了简单介绍,以便读者能够整体了解Spring的核心技术架构。表1-2 Spring的核心JAR包续表1.4 Spring的注解

Spring的注解将应用程序中Bean的定义和Bean之间复杂的依赖关系的配置从XML配置中解放出来,应用程序只需在需要某些服务或者功能时,使用注解依赖注入即可,具体Bean的定义和依赖关系由Spring的自动装配来完成。这使得Spring的使用更加方便。1.4.1 Spring注解的使用

Spring注解的使用很简单,首先导入命名规范,然后指定IoC的扫描包,最后在Java类中直接使用注解依赖注入需要的资源即可。1.导入命名空间及规范

在Spring的applicationContext.xml配置文件中导入命名空间及规范。代码如下。2.配置扫描包

在applicationContext.xml配置文件中配置需要扫描的包。如下代码开启了自动扫描com.alex.spring包下的所有类,也就是说,只有在com.alex.spring包中的注解才能够生效。

完整的Spring注解配置文件如下。3.使用注解

使用注解比较简单,直接在Java类中用@按需使用即可。具体代码如下。1.4.2 Spring的常用注解

Spring的注解在开发中无处不在,常用注解如表1-3所示。表1-3 Spring的常用注解续表续表1.5 Spring IoC的原理1.5.1 Spring IoC简介

Spring通过一个配置文件描述Bean和Bean之间的依赖关系,利用Java的反射功能实例化Bean并建立Bean之间的依赖关系。Spring的IoC容器在完成这些底层工作的基础上,还提供了Bean实例缓存管理、Bean生命周期管理、Bean实例代理、事件发布和资源装载等高级服务。1.5.2 Spring Bean的装配流程

Spring在启动时会从XML配置文件或注解中读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表;然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层业务提供基础的运行环境。其中Bean缓存池为HashMap实现。Spring Bean的装配流程如图1-3所示。图1-3 Spring Bean的装配流程1.5.3 Spring Bean 的作用域

Spring为Bean定义了5种作用域,分别为Singleton(单例)、Prototype(原型)、Request(请求级别)、Session(会话级别)和Global Session(全局会话)。1.Singleton

Singleton是单例模式,当实例类型为单例模式时,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,都始终指向同一个Bean对象。该模式在多线程下是不安全的。Singleton作用域是Spring中的默认作用域,也可以通过配置将Bean定义为Singleton模式,具体配置如下。2.Prototype

Prototype是原型模式,每次通过Spring容器获取Prototype定义的Bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而Singleton全局只有一个对象。因此,对有状态的Bean经常使用Prototype作用域,而对无状态的Bean则使用Singleton作用域。具体配置如下。3.Request

Request指在一次HTTP请求中容器会返回该Bean的同一个实例,而对不同的HTTP请求则会创建新的Bean实例,并且该Bean实例仅在当前HTTP 请求内有效,当前HTTP请求结束后,该Bean实例也将会随之被销毁。具体配置如下。4.Session

Session指在一次HTTP Session中容器会返回该Bean的同一个实例,而对不同的Session请求则会创建新的Bean实例,该Bean实例仅在当前Session内有效。和HTTP请求相同,每一次Session都会创建新的Bean实例,而不同的Bean实例之间不共享数据,且Bean实例仅在自己的Session内有效,请求结束,则Bean实例将随之被销毁。具体配置如下。5.Global Session

Global Session指在一个全局的HTTP Session中容器会返回该Bean的同一个实例,且仅在使用Portlet Context时有效。1.5.4 Spring Bean的生命周期

Spring Bean的生命周期执行过程如图1-4所示。图1-4 Spring Bean的生命周期执行过程(1)实例化一个Bean。(2)按照Spring上下文对实例化的Bean进行配置。(3)如果这个Bean实现了BeanNameAware接口,则会调用它实现的setBeanName(String)方法,该方法传递的参数是Spring配置文件中Bean的id值。(4)如果这个Bean实现了BeanFactoryAware接口,则会调用它实现的setBeanFactory(BeanFactory)方法,该方法传递的参数是Spring工厂自身。(5)如果这个Bean实现了ApplicationContextAware接口,则会调用setApplication Context(ApplicationContext)方法,该方法传入的参数是Spring上下文。(6)如果该Bean关联了BeanPostProcessor接口,则会调用postProcessBefore Initialization(Object obj,String s)方法,该方法在Bean初始化前调用,常用于定义初始化Bean的前置工作,比如系统缓存的初始化。(7)如果Bean在Spring配置文件中配置了init-method属性,则会自动调用其配置的初始化方法。(8)如果某个Bean关联了BeanPostProcessor接口,将会调用postProcessAfter Initialization(Object obj,String s)方法。至此,Bean的初始化工作就完成了,应用程序就可以开始使用Bean实例了。(9)当Bean不再被需要时,会在清理阶段被清理掉。如果Bean实现了DisposableBean接口,则Spring会在退出前调用实现类的destroy()方法。(10)如果某个Bean的Spring配置文件中配置了destroy-method属性,在Bean被销毁前会自动调用其配置的销毁方法。1.5.5 Spring 的4种依赖注入1.构造器注入

构造器注入指通过在类的构造函数中注入属性或对象来实现依赖注入。如下代码通过标签配置了一个id为persionDaoImpl的Bean,并通过

标签在其构造函数中注入了一个message属性,注入完成后在类中可以直接通过this.message获取注入的属性值。2.set方法注入

set方法注入是通过在类中实现get、set方法来实现属性或对象的依赖注入的。如下代码通过标签配置了一个id为persionDaoImpl的Bean,并通过标签在Bean中注入了一个id为123的属性值,注入完成后在类中可以直接使用getId()获取注入的属性。3.静态工厂注入

静态工厂注入是通过调用工厂类中定义的静态方法来获取需要的对象的,为了让Spring管理所有对象,应用程序不能直接通过“工厂类.静态方法()”的方式获取对象,而需要通过Spring注入的方式获取。代码如下。

上述代码定义了一个DaoFactory工厂类和getStaticFactoryDaoImpl()静态工厂方法,该方法实例化并返回一个StaticFactoryDaoImpl实例;同时定义了一个SpringAction类,并通过setStaticFactoryDao获取注入的FactoryDao。具体的XML注入语法如下。

上述代码定义了一个name为staticFactoryDao的工厂类,并通过factory-method定义了实例化对象的方法,这里实例化对象的方法是一个名为getStaticFactoryDaoImpl的静态方法。该静态方法返回一个工厂类实例,在springAction中通过标签注入静态工厂实例。4.实例工厂注入

实例工厂注入指的是获取对象实例的方法是非静态的,因此首先需要实例化一个工厂类对象,然后调用对象的实例化方法来实例化对象。具体代码如下。

上述代码定义了一个name为factoryDao的工厂类,并通过factory-method定义了实例化对象的方法,这里实例化对象的方法是一个名为getFactoryDaoImpl的方法。该方法返回一个工厂类,在springAction中通过标签注入工厂实例。1.5.6 自动装配的5种方式

Spring的装配方式包括手动装配和自动装配。手动装配包括基于XML装配(构造方法、set方法等)和基于注解装配2种方式。自动装配包括5种装配方式,这5种方式均可以用来引导Spring容器自动完成依赖注入,具体如下。(1)no:关闭自动装配,通过显式设置ref 属性来进行对象装配。(2)byName:通过参数名自动装配,Bean的autowire被设置为byName后,Spring容器试图匹配并装配与该Bean的属性具有相同名字的Bean。(3)byType:通过参数类型自动装配,Bean的autowire被设置为byType后,Spring容器试图匹配并装配与该Bean的属性具有相同类型的Bean。(4)constructor:通过设置构造器参数的方式来装配对象,如果没有匹配到带参数的构造器参数类型,则Spring会抛出异常。(5)autodetect:首先尝试使用constructor来自动装配,如果无法完成自动装配,则使用byType方式进行装配。1.6 Spring AOP的原理1.6.1 Spring AOP简介

Spring AOP通过面向切面技术将与业务无关却为业务模块所共用的逻辑代码封装起来,以提高代码的复用率,降低模块之间的耦合度。

Spring AOP将应用分为核心关注点和横切关注点两个部分。业务处理流程为核心关注点,被业务所依赖的公共部分为横切关注点。横切关注点的特点是其行为经常发生在核心关注点的多处,而多处操作基本相似,比如权限认证、日志、事务。AOP的核心思想是将核心关注点和横切关注点分离开来,以降低模块耦合度。Spring AOP的主要应用场景如表1-4所示。表1-4 Spring AOP的主要应用场景

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载