1、常見的異常和異常的種類。列舉幾種,SpringMVC如何統一處理異常?
編譯時異常:服務器宕機、數據庫崩潰、
運行時異常:空指針異常、索引越界異常、arithmeticException異常、類型轉換異常、方法不存在異常、方法傳遞參數錯誤
springMvc處理異常流程
瀏覽器——》前端控制器——》controller——》service——》dao
若是dao層方法有異常,會一層一層往上拋出異常
Spring 統一異常處理有 3 種方式,分別爲:
(1)使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver;
(2)實現Spring的異常處理接口HandlerExceptionResolver 自定義本身的異常處理器;
(3)使用@ExceptionHandler註解實現異常處理,只能在同一個controller中;前端
3.2版本以後: @ControllerAdvice 和 @ ExceptionHandler 註解
1、實現HandlerExceptionResolverjava
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
applicationContext.xml中定義這樣一個bean對象,如
<bean id="exceptionResolver"class="com.tiantian.xxx.web.handler.ExceptionHandler"/> mysql
400,500等異常,修改web.xml文件linux
1 <!-- 出錯頁面定義 --> 2 <error-page> 3 <exception-type>java.lang.Throwable</exception-type> 4 <location>/500.jsp</location> 5 </error-page> 6 <error-page> 7 <error-code>500</error-code> 8 <location>/500.jsp</location> 9 </error-page> 10 <error-page> 11 <error-code>404</error-code> 12 <location>/404.jsp</location> 13 </error-page>
2、Arraylist的初始容量和擴容因子爲多少?hashMap呢?hashMap的hash怎麼實現的,二者底層的數據結構git
ArrayList的初始容量爲10,擴容因子爲1.按 數組當前足夠的最小容量 * 1.5 進行擴容。 hashMap的初始容量爲16,擴容因子爲0.75,程序員
HashMap中的hash算法是經過key的hashcode值與其hashcode右移16位後獲得的值進行異或運算獲得的github
1 static final int hash(Object key) { 2 int h; 3 return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); 4 }
# hashMap原理 #web
HashMap是一個雙列集合,是線程不安全的。以key、value的形式儲存值。底層是由數組+鏈表+紅黑樹組成的,數組是HashMap的主幹,鏈表則是主要爲了解決哈希衝突而存在的,根據key計算出hash值,存儲在數組裏面,當hsah值衝突的時候,經過equals方法比較,若是不一樣就建立鏈表存儲在鏈表裏面。當鏈表長度超過8的時候,會自動轉化爲紅黑樹。他的容量initialCapacity默認爲16,負載因子loadFactory默認爲0.75。當存儲的容量大於hashmap的容量乘以0.75的時候,就會自動擴容。redis
Arraylist底層爲數組,線程不安全,查找和修改快,有序和能夠重複。hashMap底層爲數組加列表加紅黑樹,線程不安全,可存儲null值。算法
3、java8中Lambda表達式和方法引用的瞭解?區別是什麼?經常使用的Stream API哪些是中間操做,哪些是終止操做?
list.forEach(n -> System.out.println(n)); list.forEach(System.out::println); // 使用方法引用
然而,若對參數有任何修改,則不能使用方法引用,而需鍵入完整地 lambda 表達式,以下所示:
list.forEach((String s) -> System.out.println("*" + s + "*"));
事實上,能夠省略這裏的 lambda 參數的類型聲明,編譯器能夠從列表的類屬性推測出來。
中間操做:
filter——接收 Lambda , 從流中排除某些元素。
limit——截斷流,使其元素不超過給定數量。
skip(n) —— 跳過元素,返回一個扔掉了前 n 個元素的流。若流中元素不足 n 個,則返回一個空流。與 limit(n) 互補
distinct——篩選,經過流所生成元素的 hashCode() 和 equals() 去除重複元素
終止操做
allMatch——檢查是否匹配全部元素
anyMatch——檢查是否至少匹配一個元素
noneMatch——檢查是否沒有匹配的元素
findFirst——返回第一個元素
findAny——返回當前流中的任意元素
count——返回流中元素的總個數
max——返回流中最大值
min——返回流中最小值
這是一個能夠爲 null 的容器對象。若是值存在則 isPresent()方法會返回 true,調用 get()方法會返回該對象。
4、Thread,Executor和ExecutorService的區別,他們的使用方式和不一樣點。
建立線程的類Thread,繼承它Thread,重寫run方法,將要執行的方法寫在run方法中,建立Thread的子類對象,開啓線程。
建立線程池的接口Executor。日常咱們建立線程池時,通常使用它的子類:new ThreadPoolExecutor (。。。。){ }。
ExecutorService是一個接口,繼承了Executor。而Executor也是一個接口,該接口只包含了一個方法:void execute(Runnable command);
,該方法接收一個 Runable 實例,它用來執行一個任務,任務即一個實現了 Runnable 接口的類。
public static ExecutorService newFixedThreadPool(int nThreads)
public static ExecutorService newCachedThreadPool()
public static ExecutorService newSingleThreadExecutor()
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
關閉調用順序
shutdown方法
awaitTermination方法
shutdownNow方法(發生異常或者是Timeout的時候)
5、spring的做用以及工做中經常使用的組件,以及BeanFactory和ApplicationContext的區別
用於和其它框架整合,聲明式事務的支持,簡化開發,實現程序低耦合,方便測試,加強了系統的可維護性和擴展性。
經常使用組件:
Spring中我的認爲三大核心組件分別是:beans、context、core。
一、beans:beans又是核心中最重要的一個,由於其它兩個都是圍繞它的。咱們都知道Spring中的IOC(控制反轉)就是將原來又程序員控制的對象(bean)反轉來交給Spring幫咱們管理。天然而然這裏的beans就是咱們Java應用中須要使用到的對象集合。全部我說這個核心中的核心,由於你沒有了bean,Spring也就沒有存在的必要了。
二、context:字面理解就是上下文的意思,彷彿是咱們在文章中使用到的術語,可是Spring的命名者(也就是Spring的發明者)爲何要使用這個名字呢?我的認爲,這裏術語「上下文」中的文,其實就是Spring管理的bean。咱們將Spring容器當作是一片文章,而bean就是每一個段落或者每句文字,而「上下」咱們能夠理解成Java中bean與bean之間的依賴(引用)。咱們都知道文件的段落與段落之間都是有聯繫的(什麼承上啓下啊等等)。固然咱們Java中的bean之間也會存在互相引用等關係。有了前面的理解,咱們其實大概就知道context的做用了。做用就是負責管理Spring中bean與bean之間關係的。
三、core:這翻譯過來就是核心的意思。但其實它的做用主要是爲context在管理Spring中bean與bean之間關係時爲其服務的。其實直白一點就是爲Spring管理bean提交工具的一個工具類。這裏的類是咱們生活中的類,不是Java世界中的類哈!Java中它多是接口。
BeanFactory和ApplicationContext的區別:
BeanFactory 是IoC容器的基礎接口,BeanFactory提供了最基本的IoC容器的功能,即全部的容器至少須要實現的標準。BeanFactory 有三個子類接口:ListableBeanFactory(列出工廠能夠生產的全部實例)、HierarchicalBeanFactory (使BeanFactory有了雙親Factory)和AutowireCapableBeanFactory(管理ApplicationContext以外的Bean)
在ApplicationContext的設計中,一方面,能夠看到它繼承了BeanFactory接口體系中的ListableBeanFactory、AutowireCapableBeanFactory、HierarchicalBeanFactory等BeanFactory的接口,具有了BeanFactory Ioc容器的基本功能(經過適配器模式適配到BeanFactory);另外一方面,經過繼承MessageSource、ResourceLoader、ApplicationEventPublisher這些接口,爲ApplicationContext賦予了更高級的Ioc容器特性。對於ApplicationContext而言,爲了在Web環境中使用它,還設計了WebApplicationContext接口。
其中BeanFactory是純粹的Bean容器,用來存儲描述Bean,無關其餘環境,而像ApplicationContext,也是Bean容器,但它和應用環境息息相關,因此被稱爲應用上下文(環境)更恰當,從圖中也能看出來,ApplicationContext不只有着BeanFactory「血統」,同時也繼承了EnvironmentCapable、MessageSource、ApplicationEventPublisher,即擴展了其許多額外功能,而其實現類則是和具體應用相關了.
6、簡述springboot的自動配置原理?日常使用最高的springboot註解及做用,第三方中間件的整合(redis,mybatis)
它主要加載了@SpringBootApplication註解主配置類,這個@SpringBootApplication註解主配置類裏邊最主要的功能就是SpringBoot開啓了一個@EnableAutoConfiguration註解的自動配置功能。
7、springboot爲何不須要外置的web服務器,springboot怎麼實現的
有一個內置的Tomcat服務器
首先是容器的註冊,ServletWebServerFactoryConfiguration是Spring Boot提供的一個配置類,在這個類裏默認註冊了三種容器工廠TomcatServletWebServerFactory,JettyServletWebServerFactory,UndertowServletWebServerFactory,這三種都以Bean的形式加入到了Spring的Bean容器中,以供接下來的程序調用。
Spring Boot在ServletWebServerApplicationContext中重載了onRefresh方法,除了之前Spring默認的onRefresh方法外還增長了createWebServer方法,在這個方法中對Web容器進行了初始化工做。
在ServletWebServerApplicationContext類中獲取到相應的容器工廠後會調用容器工廠的getWebServer方法,下面以Tomcat爲例說明容器工廠的做用。
經過getWebServer方法會new一個TomcatWebServer對象,new對象的方法會調用initialize方法,在這個方法中會對容器進行初始化並啓動。
8、springCloud的瞭解,經常使用的組件有哪些,簡述一下這些組件使用場景以及如何擴展配置
springcloud是一套完整的微服務解決方案,基於springboot框架。但準確來講,它並非一個框架,而更像是一個大的容器,將市面上成型比較好的微服務框架集成進來,簡化了開發者的代碼;
Springcloud 經常使用組件介紹;
Spring Cloud Eureka:註冊中心
Spring Cloud Feign:聲明式服務調用,本質上就是Ribbon+Hystrix,使得Eureka和Ribbon的使用更爲簡單
Spring Cloud Hystrix:融斷機制,斷路器,防止對某一故障服務持續進行訪問
Spring Cloud Ribbon:實現客戶端負載均衡
Spring Cloud Zuul:服務網關,具有服務路由、均衡負載、權限控制等功能
Spring Cloud Config:統一管理配置文件
Spring Cloud Sleuth:分佈式追蹤解決方案(服務多了,調用的線路就會很複雜,須要跟蹤來知道你究竟是怎麼走的)
9、Docker中進入容器的命令是什麼,查看容器詳細信息和資源使用量的命令,dockerfile中CMD和ENTRYPOINT的區別,瞭解過docker-compose
進入容器 exec
查看容器詳細信息 ps
資源使用量 stats
dockerfile中CMD和ENTRYPOINT的區別:
docker-compose:
Docker Compose是一個用來定義和運行復雜應用的Docker工具。使用Compose,你能夠在一個文件中定義一個多容器應用,而後使用一條命令來啓動你的應用,完成一切準備工做。
- github.com/docker/compose
一個使用Docker容器的應用,一般由多個容器組成。使用Docker Compose,再也不須要使用shell腳原本啓動容器。在配置文件中,全部的容器經過services
來定義,而後使用docker-compose
腳原本啓動,中止和重啓應用,和應用中的服務以及全部依賴服務的容器。
docker-compose up 用於建立並運行容器.
docker-compose down 用於中止並移除容器,網絡,鏡像和卷。
10、列舉幾個常見的git命令,git中merge和rebase的區別,使用過gitlab自動化部署嗎
提交暫存區到倉庫區
$ git commit -m [message]
# 列出全部本地分支
$ git branch
# 合併指定分支到當前分支
$ git merge [branch]
11、mysql優化
1.保證不查詢多餘的列與行。
2.慎用distinct關鍵字(去重)
3.慎用union關鍵字(合併),知足union的語句必須知足:1.列數相同。 2.對應列數的數據類型要保持兼容
4.判斷表中是否存在數據?使用select count(1) id from product
5.鏈接查詢的優化,根據左右鏈接關聯查詢特色肯定使用哪一種查詢方式
select * from ((select * from orde where OrderId>10000) o left join orderproduct op on o.orderNum=op.orderNum )
select * from (orde o left join orderproduct op on o.orderNum=op.orderNum ) where o.OrderId>10000
6.查詢條件中,必定不要使用select *
7.在表中創建索引,優先考慮where.group by使用到的字段
8.對於連續的數值,能用 between 就不要用 in
9.儘可能不要在 where 子句中對字段進行表達式操做
like不能%開頭,會致使索引無效;當like前綴沒有%,後綴有%時,索引有效。
組合索引,要第一列用索引,不然索引失效。
數據類型出現隱式轉化。如varchar要加單引號,不然會使索引無效,產生全表掃描。
在索引列上不能使用 IS NULL 或 IS NOT NULL操做。索引是不索引空值的,因此這樣的操做不能使用索引,能夠用其餘的辦法處理,例如:數字類型,判斷大於0,字符串類型設置一個默認值,判斷是否等於默認值便可。
在索引字段上不能使用not,<>,!=。不等於操做符是永遠不會用到索引的,所以對它的處理只會產生全表掃描。 優化方法: key<>0 改成 key>0 or key<0。
對索引字段不能進行計算操做。
在索引字段上不能使用函數。
12、常見的linux命令
列出文件列表:ls 【參數 -a -l】
建立目錄和移除目錄:mkdir rmdir