发表于: 2017-11-21 22:10:47
1 710
一.今日完成
整理深度思考知识点
Task01
1.maven是什么,和Ant有什么区别?
Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
Maven也可被用于构建和管理各种项目,例如C#,Ruby,Scala和其他语言编写的项目。Maven曾是Jakarta项目的子项目,现为由Apache软件基金会主持的独立Apache项目。
ANT:
>没有正式的约定像一个公共的项目目录结构,你必须告诉Ant到哪里找到源和放在哪里的输出。随着时间的推移,出现了非正式的惯例,但它们尚未被编入产品。
>是程序性的,你必须告诉Ant具体做什么和什么时候做。你必须告诉它编译,然后复制,然后压缩。
>没有生命周期,你必须定义目标和目标依赖。您必须手动将一系列任务附加到每个目标。
MAVEN:
>有约定,它已经知道你的源代码是什么,因为你遵循约定。它将字节码放在target / classes中,并在目标中生成一个JAR文件。
>是声明性的。所有你需要做的是创建一个pom.xml文件,并将您的源放在默认目录。 Maven照顾了其余的。
>有一个生命周期,您在执行mvn install时调用它。此命令告诉Maven执行一系列顺序步骤,直到它到达生命周期。作为这个遍历生命周期的旅程的副作用,Maven执行了一些默认的插件目标,这些目标就像编译和创建JAR。
2.clean,install,package,deploy分别代表什么含义?
(1)创建Maven的普通java项目:
mvn archetype:create
-DgroupId=packageName
-DartifactId=projectName
(2)创建Maven的Web项目:
mvn archetype:create
-DgroupId=packageName
-DartifactId=webappName
-DarchetypeArtifactId=maven-archetype-webapp
(3)编译源代码:mvn compile
(4)编译测试代码:mvn test-compile
(5)运行测试:mvn test
(6)产生site:mvn site
(7)打包:mvn package
(8)在本地Repository中安装jar:mvn install
(9)清除产生的项目:mvn clean
(10)生成idea项目:mvn idea:idea
(11)组合使用goal命令,如只打包不测试:mvn -Dtest package
(12)编译测试的内容:mvn test-compile
(13)只打jar包: mvn jar:jar
(14)只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile
3.怎么样能让Maven跳过JUnit?
(1)mvn install –DskipTests
(2)mvn install -Dmaven.test.skip=true
(3)
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
<configuration>
<includes>
<include>**/Test1.java</include>
<include>**/Test2.java</include>
</includes>
<excludes>
<exclude>**/Test3.java</exclude>
<exclude>**/Test4.java</exclude>
</excludes>
</configuration>
</plugin>
4.为什么要用Log4j来替代System.out.println?
日志框架和System.out相比有两大优势:分类和级别。两者可以选择性的过滤日志,永久的或者只是在排查错误的时候。
5.为什么DB的设计中要使用Long来替换掉Date类型?
(1)因为DATE有固定的格式,不同的地区有不同的时间表示法;
(2)方便参与算术运算
6.自增ID有什么坏处?什么样的场景下不使用自增ID?
自增id无法处理高并发和分布式的情况
(1)高并发:同一个服务同时出现很多注册请求时,自增id无法同时处理,只能排序录入。
(2)分布式:在不同的数据库中部署相同的服务时,如果使用自增id就会出现id相同的情况,而id是用户的唯一标识符,必须保证唯一性。
处理方案:在用户信息录入时,生成随机不重复id的方式。
7.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。
8.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。
唯一性索引(unique index)和一般索引(normal index)最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索引的数据列可以为空,但是只要存在数据值,就必须是唯一的。
9.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?
不需要.
10.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
默认读取服务器时间,不应该授权.
11.修真类型应该是直接存储Varchar,还是应该存储int?
Varchar类型,见名知意原则.
12.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?
MySQL数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字节.
TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有65535字节的最大限制;TEXT则不需要。把一个超过列类型最大长度的值赋给一个TEXT列,值被截断以适合它。
13.怎么进行分页数据的查询,如何判断是否有下一页?
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
多取指定范围之前的一个数据和之后的一个数据,用来判断是否还有前一页和后一页。
14.为什么不可以用Select * from table?
FROM子句指定了SELECT语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由+INNER+JOIN、LEFT+JOIN+或+RIGHT+JOIN+得到的复合结果。如果表或查询存储在外部数据库,在IN+子句之后指明其完整路径。
15.什么是贫血模型,什么是充血模型?为什么我们会强制要求使用贫血模型?
贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。
优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Business Logic->Data Access(ADO.NET)。当然Business Logic是依赖Domain Object的。
该模型的缺点是不够面向对象,领域对象只是作为保存状态或者传递状态使用,所以就说只有数据没有行为的对象不是真正的对象。在Business Logic里面处理所有的业务逻辑,在POEAA(企业应用架构模式)一书中被称为Transaction Script模式。
充血模型:层次结构和上面的差不多,不过大多业务逻辑和持久化放在Domain Object里面,Business Logic只是简单封装部分业务逻辑以及控制事务、权限等,这样层次结构就变成Client->(Business Facade)->Business Logic->Domain Object->Data Access。
优点是面向对象,Business Logic符合单一职责,不像在贫血模型里面那样包含所有的业务逻辑太过沉重。
缺点是如何划分业务逻辑,什么样的逻辑应该放在Domain Object中,什么样的业务逻辑应该放在Business Logic中,这是很含糊的。即使划分好了业务逻辑,由于分散在Business Logic和Domain Object层中,不能更好的分模块开发。熟悉业务逻辑的开发人员需要渗透到Domain Logic中去,而在Domian Logic又包含了持久化,对于开发者来说这十分混乱。其次,因为Business Logic要控制事务并且为上层提供一个统一的服务调用入口点,它就必须把在Domain Logic里实现的业务逻辑全部重新包装一遍,完全属于重复劳动。
16.Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
Ioc(Inversion of Control)不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将设计好的对象交给容器控制,而不是传统的在对象内部直接控制。理解IoC的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”.
谁控制谁,控制什么:传统Java程序设计,直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;
谁控制谁:当然是IoC 容器控制了对象;
控制什么:主要控制了外部资源获取(。
为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;
17.为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
接口分离原则的核心思想是:不应该强迫客户程序依赖它们不需要使用的方法。英文缩写ISP,即Interface Segregation Principle。其实接口分离原则的意思就是:一个接口不需要提供太多的行为,一个接口应该只提供一种对外的功能,不应该 把所有的操作都封装到一个接口中。
这里的“接口”指的不仅仅是通过interface关键字定义的接口,接口分为如下两种。
对象接口。java中声明的一个类,通过new关键字产生的一个实例,它是对一个类型的事物的描述,这也是一种接口。
类接口。这中接口就是通过关键字interface 定义的接口。
也就是说,接口分离原则要求的是在一个模块中应该只依赖它需要的接口,以保证接口的小纯洁。而且需要保证接口应该尽量小,即设计接口的时候应该让接口尽量细化,不要定义太臃肿的接口(比如接口中有很多不相干的逻辑方法声明)。
接口分离原则与单一职责有些相似,不过不同在于:单一职责原则要求的是类和接口职责单一,注重的是职责,是业务逻辑上的划分。而接口分离原则要求的是接口的方法尽量少,针对一个模块尽量有用。
18.为什么要处理异常,Try/Catch应该在什么样的场景下使用,在真实的系统中,会出现网络中断,DB连接不上的错误吗?多久会发生一次?
语言通过面向对象的异常处理机制来解决运行期间的错误,可以预防错误的程序代码或系统错误所造成的不可预期的结果发生。减少编程人员的工作,增加了程序的灵活性,增加程序的可读性和健壮性.
Java异常处理通过5个关键字try、catch、throw、throws、finally进行管理。基本过程是用try语句块包住要监视的语句,如果在try语句块内出现异常,则异常会被抛出,代码在catch语句块中可以捕获到这个异常并做处理;还有一部分系统生成的异常在Java运行时自动抛出。也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过throw抛出异常对象。
会,随机出现,符合墨菲定律.
19.日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?
很多开发人员习惯于使用 System.out.println、System.err.println 以及异常对象的 printStrackTrace 方法来输出相关信息。这些使用方式虽然简便,但是所产生的信息在出现问题时并不能提供有效的帮助。这些使用方式都应该改为使用日志 API。
在记录日志消息时应该尽可能多的包含当前上下文中的各种信息,以方便在遇到问题时可以快速的获取到所需的信息。
20.为什么需要单步调试?Debug的时候IDE是怎么找到源码的?
debug用来追溯代码的运行流程,通常在程序运行跟预期结果不符合的时(程序运行时出现异常),那么启动debug模式可以分析定位异常发生的位置,帮助程序员更好的fix bug.
The Java Platform Debugger Architecture (JPDA) consists of three interfaces designed for use by debuggers in development environments for desktop systems.
21.可否远程连接到线上直接调试?真实的项目中,遇到问题的排查方案是什么?
可以.
不知道.
Task02
1.什么是restful?rest的请求方法有哪些,有什么区别?
Representational State Transfer的缩写。"表现层状态转化"。如果一个架构符合REST原则,就称它为RESTful架构。
支持GET,DELETE,PUT和POST.
2.为什么要用Rest风格,如果不用Rest的话,接口应该怎么定义,在使用Rest风格之前,大家都是用什么方式写接口的?
RESTful架构风格规定,数据的元操作,即CRUD(create, read, update和delete,即数据的增删查改)操作,分别对应于HTTP方法:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,这样就统一了数据操作的接口,仅通过HTTP方法,就可以完成对数据的所有增删查改工作。
一get到底,堪比万金油;URL格式混乱.
3.了解maven的module。
一个项目往往是由多个 project 构成的,在进行构建(build)时,针对多个 project 分别执行多次构建命令,这样极容易产生遗漏也会大大降低效率。Maven 的聚合功能可以通过一个父模块将所有的要构建模块整合起来,将父模块的打包类型声明为 POM,通过 <modules> 将各模块集中到父 POM 中。
父模块不需要有源代码和资源文件,即没有 src/main/java 和 src/test/java 目录。Maven首先解析父模块的 POM 文件,分析要构建的模块,并通过各模块的依赖关系计算出模块的执行顺序,根据这个潜在的关系依次构建模块。将各子模块聚合到父模块中后,我们就可以对父模块进行一次构建命令来完成全部模块的构建。
4.什么是http协议?Get和post请求有什么区别?http请求content-Type有几种,有什么区别?http适合什么场景?http状态码有哪些?
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。
设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。
GET
向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。参见安全方法
POST
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
常见的Content-Type:
(1)text/html
(2)text/plain
(3)text/css
(4).text/javascript
(5)application/x-www-form-urlencoded
(6)multipart/form-data
(7)application/json
(8)application/xml
状态代码的第一个数字代表当前响应的类型:
1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接受
3xx重定向——需要后续操作才能完成这一请求
4xx请求错误——请求含有词法错误或者无法被执行
5xx服务器错误——服务器在处理某个正确请求时发生错误.
5.什么是tcp/ip协议?TCP的三次握手指的是什么,为什么一定要三次握手,而不是四次或者是两次?
TCP/IP 指传输控制协议/网际协议 (Transmission Control Protocol / Internet Protocol)。是供已连接因特网的计算机进行通信的通信协议。
TCP/IP 定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。
三次握手(Three-way Handshake),是指建立一个 TCP 连接时,需要客户端和服务器总共发送3个包。
三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。
第一次握手(SYN=1, seq=x):
客户端发送一个 TCP 的 SYN 标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。
发送完毕后,客户端进入 SYN_SEND 状态。
第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加1,即X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。
第三次握手(ACK=1,ACKnum=y+1)
客户端再次发送确认包(ACK),SYN 标志位为0,ACK 标志位为1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1
发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手结束。
6.什么是WEBService,实现WEBService有哪些框架,为什么WEBService经常被认为太重了,只有银行和大型国企才会使用的更多有一些?
Web服务是一种服务导向架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。
根据W3C的定义,Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务通常是许多应用程序接口(API)所组成的,它们透过网络,例如国际互联网(Internet)的远程服务器端,执行客户所提交服务的请求。
RPC,SOAP,RESTFUL
二.明日计划
把任务2~9的在深度思考题目答案整理完成.
三.遇到问题
暂无.
四.收获
以上.
评论