前言
題目彙總來源 史上最全各類面試題彙總,沒有之一,不接受反駁
目前轉安卓了,這一塊暫時就不繼續更新了。
- 面試題彙總一 Java 語言基礎篇
- 面試題彙總二 Java 多線程篇
- 面試題彙總三 Java 集合篇
- 面試題彙總四 JVM 篇
- 面試題彙總五 Spring 篇
- 面試題彙總六 數據庫篇
- 面試題彙總七 計算機網絡篇
目錄
Bean 工廠和 Application contexts 有什麼區別?
談談@Required、 @Autowired、 @Qualifier註解。
tomcat容器是如何創建servlet類實例?用到了什麼原理?
Tomcat 有哪幾種Connector 運行模式(優化)?
1. spring概述
使用Spring框架的好處是什麼?
- Spring 是一個非入侵(non-invasive)框架,其目標是使應用程序代碼對框架的依賴最小化,應用代碼可以在沒有 Spring 或其他容器的情況下運行。
- Spring 提供了一個一致的編程模型,使應用直接使用POJO開發,從而可以與運行環境(如應用服務器)隔離開來。
- Spring 推動應用的設計風格向面向對象及面向接口編程轉變,提高了代碼的重用性和可測試性。
- Spring 改進了體系結構的選擇,雖然作爲應用平臺,Spring 可以幫助我們選擇不同的技術實現,降低平臺鎖定的風險。
Spring由哪些模塊組成?
解釋AOP模塊
AOP(Aspect Oriented Programming,面向切面編程)是Spring另一個重要特徵。AOP把一個業務流程分成幾個部分,例如:日誌記錄、權限檢查、業務處理等,然後把它們組裝成完整的業務流程。每個部分被稱爲切面(Aspect)或者,關注點。
Aop: aspect object programming 面向切面編程
- 功能: 讓關注點代碼與業務代碼分離!
- 面向切面編程就是指: 對很多功能都有的重複的代碼抽取,再在運行的時候往業務方法上動態植入“切面類代碼”。
關注點:
- 重複代碼就叫做關注點。
解釋 WEB 模塊
包含Web應用開發時,用到Spring框架時所需的核心類,包括自動載入WebApplicationContext特性的類、Struts與JSF集成類、文件上傳的支持類、Filter類和大量工具輔助類;
核心容器(應用上下文) 模塊。
這是基本的Spring模塊,提供spring 框架的基礎功能,BeanFactory 是任何以spring爲基礎的應用的核心。Spring 框架建立在此模塊之上,它使Spring成爲一個容器。
什麼是Spring IOC 容器?
Spring IOC 負責創建對象,管理對象(通過依賴注入(DI),裝配對象,配置對象,並且管理這些對象的整個生命週期。
// ApplicationContext 就是一種IOC容器。
IOC的優點是什麼?
IOC 或 依賴注入把應用的代碼量降到最低。它使應用容易測試,單元測試不再需要單例和JNDI查找機制。最小的代價和最小的侵入性使鬆散耦合得以實現。IOC容器支持加載服務時的餓漢式初始化和懶加載。
ApplicationContext通常的實現是什麼?
- FileSystemXmlApplicationContext :此容器從一個XML文件中加載beans的定義,XML Bean 配置文件的全路徑名必須提供給它的構造函數。
- ClassPathXmlApplicationContext:此容器也從一個XML文件中加載beans的定義,這裏,你需要正確設置classpath因爲這個容器將在classpath裏找bean配置。
- WebXmlApplicationContext:此容器加載一個XML文件,此文件定義了一個WEB應用的所有bean。
Bean 工廠和 Application contexts 有什麼區別?
BeanFactory和ApplicationContext的區別
BeanFactory:
是Spring裏面最低層的接口,提供了最簡單的容器的功能,只提供了實例化對象和拿對象的功能;
ApplicationContext:
應用上下文,繼承BeanFactory接口,它是Spring的一各更高級的容器,提供了更多的有用的功能;
1) 國際化(MessageSource)
2) 訪問資源,如URL和文件(ResourceLoader)
3) 載入多個(有繼承關係)上下文 ,使得每一個上下文都專注於一個特定的層次,比如應用的web層
4) 消息發送、響應機制(ApplicationEventPublisher)
5) AOP(攔截器)
2. spring依賴注入
什麼是Spring的依賴注入?
依賴注入,是IOC的一個方面,是個通常的概念,它有多種解釋。這概念是說你不用創建對象,而只需要描述它如何被創建。你不在代碼裏直接組裝你的組件和服務,但是要在配置文件裏描述哪些組件需要哪些服務,之後一個容器(IOC容器)負責把他們組裝起來。
有哪些不同類型的IOC(依賴注入)方式?
接口注入,setter方法注入,構造方法注入
什麼是Spring beans?
Spring beans 是那些形成Spring應用的主幹的java對象。它們被Spring IOC容器初始化,裝配,和管理。這些beans通過容器中配置的元數據創建。比如,以XML文件中<bean/> 的形式定義。
一個 Spring Bean 定義 包含什麼?
<bean id = "..." class = "..." lazy-init = "true"
scope="..." init-method = "..." destroy-method = "...">
<constructor-arg name="..." value="..."/>
<property name="..." value="..."/>
</bean>
解釋Spring支持的幾種bean的作用域。
Sr.No. | Scope & Description |
---|---|
1 |
singleton This scopes the bean definition to a single instance per Spring IoC container (default). |
2 |
prototype This scopes a single bean definition to have any number of object instances. |
3 |
request This scopes a bean definition to an HTTP request. Only valid in the context of a web-aware Spring ApplicationContext. |
4 |
session This scopes a bean definition to an HTTP session. Only valid in the context of a web-aware Spring ApplicationContext. |
5 |
global-session This scopes a bean definition to a global HTTP session. Only valid in the context of a web-aware Spring ApplicationContext. |
Spring框架中的單例bean是線程安全的嗎?
Spring框架並沒有對單例bean進行任何多線程的封裝處理。關於單例bean的線程安全和併發問題需要開發者自行去搞定。但實際上,大部分的Spring bean並沒有可變的狀態(比如Serview類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態的話(比如 View Model 對象),就需要自行保證線程安全。
最淺顯的解決辦法就是將多態bean的作用域由“singleton”變更爲“prototype”。
解釋Spring框架中bean的生命週期
- 實例化一個Bean--也就是我們常說的new;
- 按照Spring上下文對實例化的Bean進行配置--也就是IOC注入;
- 如果這個Bean已經實現了BeanNameAware接口,會調用它實現的setBeanName(String)方法,此處傳遞的就是Spring配置文件中Bean的id值
- 如果這個Bean已經實現了BeanFactoryAware接口,會調用它實現的setBeanFactory(setBeanFactory(BeanFactory)傳遞的是Spring工廠自身(可以用這個方式來獲取其它Bean,只需在Spring配置文件中配置一個普通的Bean就可以);
- 如果這個Bean已經實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文(同樣這個方式也可以實現步驟4的內容,但比4更好,因爲ApplicationContext是BeanFactory的子接口,有更多的實現方法);
- 如果這個Bean關聯了BeanPostProcessor接口,將會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean內容的更改,並且由於這個是在Bean初始化結束時調用那個的方法,也可以被應用於內存或緩存技術;
- 如果Bean在Spring配置文件中配置了init-method屬性會自動調用其配置的初始化方法。
- 如果這個Bean關聯了BeanPostProcessor接口,將會調用postProcessAfterInitialization(Object obj, String s)方法、;// 注:以上工作完成以後就可以應用這個Bean了,那這個Bean是一個Singleton的,所以一般情況下我們調用同一個id的Bean會是在內容地址相同的實例,當然在Spring配置文件中也可以配置非Singleton,這裏我們不做贅述。
- 當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個接口,會調用那個其實現的destroy()方法;
- 最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷燬方法。
哪些是重要的bean生命週期方法? 你能重載它們嗎?
有兩個重要的bean 生命週期方法,第一個是setup , 它是在容器加載bean的時候被調用。第二個方法是 teardown 它是在容器卸載類的時候被調用。
The bean 標籤有兩個重要的屬性(init-method和destroy-method)。用它們你可以自己定製初始化和註銷方法。它們也有相應的註解(@PostConstruct和@PreDestroy)。
什麼是bean裝配?
創建對象的協作關係稱爲裝配,也就是DI(依賴注入)的本質。而在Spring容器中對bean的創建時就需要對它所依賴的對象進行注入裝配。
Spring提供了3種裝配bean的機制:
- 在XML中進行顯式配置
- 在Java中進行顯式配置
- 隱式的bean發現機制和自動裝配
什麼是bean的自動裝配?
Spring從兩個角度實現自動化裝配:
組件掃描(component scanning):Spring會自動發現應用上下文中所創建的bean
自動裝配(autowiring):Spring自動滿足bean之間的依賴
組件掃描和自動裝配組合在一起就能發揮出強大的威力,它們能夠將你的顯示配置降低到最少。
解釋不同方式的自動裝配 。
模式 |
說明 |
Default |
在每個bean中都一個autowire=default的默認配置它的含義是: 採用beans和跟標籤中的default-autowire="屬性值"一樣的設置。
|
No |
不使用自動裝配,必須通過ref元素指定依賴,默認設置。
|
ByNname |
根據屬性名自動裝配。此選項將檢查容器並根據名字查找與屬性完全一致的bean,並將其與屬性自動裝配。例如,在bean定義中將autowire設置爲by name,而該bean包含master屬性(同時提供setMaster(..)方法),Spring就會查找名爲master的bean定義,並用它來裝配給master屬性。 |
Bytype |
如果容器中存在一個與指定屬性類型相同的bean,那麼將與該屬性自動裝配。如果存在多個該類型的bean,那麼將會拋出異常,並指出不能使用byType方式進行自動裝配。若沒有找到相匹配的bean,則什麼事都不發生,屬性也不會被設置。如果你不希望這樣,那麼可以通過設置dependency-check="objects"讓Spring拋出異常。
|
Constructor |
與byType的方式類似,不同之處在於它應用於構造器參數。如果在容器中沒有找到與構造器參數類型一致的bean,那麼將會拋出異常。 |
Antodetect |
通過bean類的自省機制(introspection)來決定是使用constructor還是byType方式進行自動裝配。如果發現默認的構造器,那麼將使用byType方式。 |
自動裝配有哪些侷限性 ?
自動裝配的侷限性是:
- 重寫: 你仍需用 <constructor-arg>和 <property> 配置來定義依賴,意味着總要重寫自動裝配。
- 基本數據類型:你不能自動裝配簡單的屬性,如基本數據類型,String字符串,和類。
- 模糊特性:自動裝配不如顯式裝配精確,如果有可能,建議使用顯式裝配。
3. spring 註解
怎樣開啓註解裝配?
註解裝配在默認情況下是不開啓的,爲了使用註解裝配,我們必須在Spring配置文件中配置 <context:annotation-config/>元素。
談談@Required、 @Autowired、 @Qualifier註解。
[Spring]@Autowired,@Required,@Qualifier註解
- @Required:這個註解表明bean的屬性必須在配置的時候設置,通過一個bean定義的顯式的屬性值或通過自動裝配,若@Required註解的bean屬性未被設置,容器將拋出BeanInitializationException。
- @Autowired:提供了更細粒度的控制,包括在何處以及如何完成自動裝配。它的用法和@Required一樣,修飾setter方法、構造器、屬性或者具有任意名稱和/或多個參數的PN方法。
- @Qualifier:當有多個相同類型的bean卻只有一個需要自動裝配時,將@Qualifier 註解和@Autowire 註解結合使用以消除這種混淆,指定需要裝配的確切的bean。
4. spring 數據訪問
在Spring框架中如何更有效地使用JDBC?
使用Spring通過什麼方式訪問Hibernate?
在Spring中有兩種方式訪問Hibernate:
- 控制反轉 Hibernate Template 和 Callback。
- 繼承 HibernateDAOSupport提供一個AOP 攔截器。
Spring框架的事務管理有哪些優點?
編程式事務管理,聲明式事務管理
- 它爲不同的事務API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統一的編程模型。
- 它爲編程式事務管理提供了一個簡單的API而非一系列複雜的事務API(如JTA)。
- 它支持聲明式事務管理。
- 它可以和Spring 的多種數據訪問技術很好的融合。
5. Spring面向切面編程(AOP)
解釋AOP
Aspect 切面
AOP核心就是切面,它將多個類的通用行爲封裝成可重用的模塊,該模塊含有一組API 提供橫切功能。比如,一個日誌模塊可以被稱作日誌的AOP 切面。根據需求的不同,一個應用程序可以有若干切面。在Spring AOP中,切面通過帶有@Aspect註解的類實現。
在Spring AOP 中,關注點和橫切關注的區別是什麼?
使用“橫切”技術,AOP把軟件系統分爲兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在覈心關注點的多處,而各處都基本相似。比如權限認證、日誌、事務處理。Aop 的作用在於分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。正如Avanade公司的高級方案構架師Adam Magee所說,AOP的核心思想就是“將應用程序中的商業邏輯同對其提供支持的通用服務進行分離。”
通知
通知是個在方法執行前或執行後要做的動作,實際上是程序執行時要通過SpringAOP 框架觸發的代碼段。
Spring切面可以應用五種類型的通知:
- before:前置通知,在一個方法執行前被調用。
- after: 在方法執行之後調用的通知,無論方法執行是否成功。
- after-returning: 僅當方法成功完成後執行的通知。
- after-throwing: 在方法拋出異常退出時執行的通知。
- around: 在方法執行之前和之後調用的通知。
有幾種不同類型的自動代理?
BeanNameAutoProxyCreator DefaultAdvisorAutoProxyCreator
什麼是織入。什麼是織入應用的不同點?
織入是將切面和到其他應用類型或對象連接或創建一個被通知對象的過程。 織入可以在編譯時,加載時,或運行時完成。
6. springMVC
什麼是Spring的MVC框架?
Spring MVC屬於SpringFrameWork的後續產品,已經融合在Spring Web Flow裏面。Spring 框架提供了構建 Web 應用程序的全功能 MVC 模塊。
DispatcherServlet
Spring的MVC框架是圍繞DispatcherServlet來設計的,它用來處理所有的HTTP 請求和響應。
WebApplicationContext
Spring-MVC理解之一:應用上下文webApplicationContext
WebApplicationContext是專門爲web應用準備的,他允許從相對於web根目錄的路勁中裝載配置文件完成初始化工作,從WebApplicationContext中可以獲得ServletContext的引用,整個Web應用上下文對象將作爲屬性放置在ServletContext中,以便web應用可以訪問spring上下文,spring中提供WebApplicationContextUtils的getWebApplicationContext(ServletContext src)方法來獲得WebApplicationContext對象
什麼是Spring MVC框架的控制器?
控制器提供一個訪問應用程序的行爲,此行爲通常通過服務接口實現。 控制器解析用戶輸入並將其轉換爲一個由視圖呈現給用戶的模型。Spring 用一個非常抽象的方式實現了一個控制層,允許用戶創建多種用途的控制器。
@Controller 註解
@RequestMapping 註解
Spring可以通過@Controller註解自動發現你的控制器類以及@RequestMapping註解中的請求映射,這樣就爲你免去了在Bean配置文件中配置它們的麻煩。此外,如果使用註解,控制器類和處理程序方法在訪問上下文資源(例如請求參數、模型屬性和會話屬性)時也會更加靈活。
7. MyBatis
8. Java Web
Servlet生命週期
- 加載和實例化
- 初始化
- 請求處理
- 服務終止
forward和redirect的區別
- forward 轉發頁面和轉發到的頁面可以共享request裏面的數據,redirect 不能共享數據
- forward 地址欄顯示就地址,redirect 顯示新地址
- forward 瀏覽器發送一次請求,redirect 發送兩次請求
tomcat容器是如何創建servlet類實例?用到了什麼原理?
- 當容器啓動時,會讀取在webapps目錄下所有的web應用中的web.xml文件,然後對 xml文件進行解析,並讀取servlet註冊信息。然後,將每個應用中註冊的servlet類都進行加載,並通過 反射的方式實例化。(有時候也是在第一次請求時實例化)
- 在servlet註冊時加上<load-on-startup>1</load-on-startup>如果爲正數,則在一開始就實例化,如果不寫或爲負數,則第一次請求實例化。
什麼是cookie?Session和cookie有什麼區別?
Servlet安全性問題
由於Servlet是單例的,當多個用戶訪問Servlet的時候,服務器會爲每個用戶創建一個線程。當多個用戶併發訪問Servlet共享資源的時候就會出現線程安全問題。
原則:
- 如果一個變量需要多個用戶共享,則應當在訪問該變量的時候,加同步機制synchronized (對象){}
- 如果一個變量不需要共享,則直接在 doGet() 或者 doPost()定義.這樣不會存在線程安全問題
Tomcat 有哪幾種Connector 運行模式(優化)?
- bio(blocking I/O)
- nio(non-blocking I/O)
- apr(Apache Portable Runtime/Apache可移植運行庫)
jsp靜態包含和動態包含的區別
- 靜態 %@include;動態 jsp:include
- 靜態只生成1個java文件;動態生成多個
- 靜態發生在 jsp→java 文件階段;動態在執行 class 文件時動態加入
- 靜態包含在兩個文件中不能有相同的變量,動態包含允許
- 動態包含可以傳參
<jsp:include page="footer.jsp">
<jsp:param name="year" value="2017" />
</jsp:include>
-----------------------------------------
<hr>
<p style="text-align:center">copyright@<%=request.getParameter("year")%>
</p>
jsp有哪些內置對象?作用分別是什麼?
Page,pageContext,request,response,session,application,out,config,exception
jsp和servlet的區別、共同點、各自應用的範圍?
寫出5種JSTL常用標籤
JSP是如何被執行的?執行效率比SERVLET低嗎?
JSP頁面是如何被執行的?JSP執行效率比Servlet低嗎?
當客戶端向一個JSP頁面發出請求時,Web Container將JSP轉化成Servlet的源代碼(只在第一次請求時),然後編譯轉化後的Servlet並加載到內存中執行,執行的結果Response到客戶端。
JSP只在第一次執行的時候會轉化爲Servlet,以後每次執行Web容器都是直接執行編譯後的Servlet,所以JSP和Servlet只是在第一次執行的時候不一樣,JSP慢一點,以後的執行都是相同的。
說出Servlet和CGI的區別?
說出Servlet的生命週期,並說出Servlet和CGI的區別
簡述JSP的設計模式。
JSP+Java Bean; MVC