java程序員進階:螞蟻金服的Spring經典面試題集錦,附答案

提及來開始進行面試是年前倒數第二週,上午9點,我還在去公司的公交上,忽然收到螞蟻的面試電話,其實算不上真正的面試。面試官只是和我聊了下他們在作的事情(主要是作雙十一這裏大促的穩定性保障,偏中間件吧),說的很詳細,而後和我溝通了下是否有興趣,我表示有興趣,後面就收到正式面試的通知,最後沒選擇去螞蟻表示抱歉。java

當時我本身也準備出去看看機會,順便看看本身的實力。當時我其實挺糾結的,一方面如今部門也正須要我,仍是能夠有一番做爲的,另外一方面以爲近一年來進步緩慢,沒有之前飛速進步的成就感了,並且業務和技術偏於穩定,加上本身也屬於那種比較懶散的人,骨子裏仍是但願可以突破現狀,持續在技術上有所精進。

通常問題

不一樣版本的 Spring Framework 有哪些主要功能? VersionFeatureSpring 2.5發佈於 2007 年。這是第一個支持註解的版本。Spring 3.0發佈於 2009 年。它徹底利用了 Java5 中的改進,併爲 JEE6 提供了支持。Spring 4.0發佈於 2013 年。這是第一個徹底支持 JAVA8 的版本。git

什麼是 Spring Framework?github

  • Spring 是一個開源應用框架,旨在下降應用程序開發的複雜度。
  • 它是輕量級、鬆散耦合的。
  • 它具備分層體系結構,容許用戶選擇組件,同時還爲 J2EE 應用程序開發提供了一個有凝聚力的框架。
  • 它能夠集成其餘框架,如 Structs、Hibernate、EJB 等,因此又稱爲框架的框架。

列舉 Spring Framework 的優勢web

  • 因爲 Spring Frameworks 的分層架構,用戶能夠自由選擇本身須要的組件。
  • Spring Framework 支持 POJO(Plain Old Java Object) 編程,從而具有持續集成和可測試性。
  • 因爲依賴注入和控制反轉,JDBC 得以簡化。
  • 它是開源免費的。

Spring Framework 有哪些不一樣的功能?面試

  • 輕量級- Spring 在代碼量和透明度方面都很輕便。
  • IOC- 控制反轉
  • AOP- 面向切面編程能夠將應用業務邏輯和系統服務分離,以實現高內聚。
  • 容器- Spring 負責建立和管理對象(Bean)的生命週期和配置。
  • MVC- 對 web 應用提供了高度可配置性,其餘框架的集成也十分方便。
  • 事務管理- 提供了用於事務管理的通用抽象層。Spring 的事務支持也可用於容器較少的環境。
  • JDBC 異常- Spring 的 JDBC 抽象層提供了一個異常層次結構,簡化了錯誤處理策略。

Spring Framework 中有多少個模塊,它們分別是什麼?spring

  • Spring 核心容器– 該層基本上是 Spring Framework 的核心。它包含如下模塊:
  • Spring Core
  • Spring Bean
  • SpEL (Spring Expression Language)
  • Spring Context
  • 數據訪問/集成– 該層提供與數據庫交互的支持。它包含如下模塊:
  • JDBC (Java DataBase Connectivity)
  • ORM (Object Relational Mapping)
  • OXM (Object XML Mappers)
  • JMS (Java Messaging Service)
  • Transaction
  • Web– 該層提供了建立 Web 應用程序的支持。它包含如下模塊:
  • Web
  • Web – Servlet
  • Web – Socket
  • Web – Portlet
  • AOP– 該層支持面向切面編程
  • Instrumentation– 該層爲類檢測和類加載器實現提供支持。
  • Test– 該層爲使用 JUnit 和 TestNG 進行測試提供支持。
  • 幾個雜項模塊:
  • Messaging – 該模塊爲 STOMP 提供支持。它還支持註解編程模型,該模型用於從 WebSocket 客戶端路由和處理 * STOMP 消息。
  • Aspects – 該模塊爲與 AspectJ 的集成提供支持。

什麼是 Spring 配置文件?數據庫

Spring 配置文件是 XML 文件。該文件主要包含類信息。它描述了這些類是如何配置以及相互引入的。可是,XML 配置文件冗長且更加乾淨。若是沒有正確規劃和編寫,那麼在大項目中管理變得很是困難。編程

Spring 應用程序有哪些不一樣組件?bash

Spring 應用通常有如下組件:session

  • 接口- 定義功能。
  • Bean 類- 它包含屬性,setter 和 getter 方法,函數等。
  • Spring 面向切面編程(AOP)- 提供面向切面編程的功能。
  • Bean 配置文件- 包含類的信息以及如何配置它們。
  • 用戶程序- 它使用接口。

使用 Spring 有哪些方式?

使用 Spring 有如下方式:

  • 做爲一個成熟的 Spring Web 應用程序。
  • 做爲第三方 Web 框架,使用 Spring Frameworks 中間層。
  • 用於遠程使用。
  • 做爲企業級 Java Bean,它能夠包裝現有的 POJO(Plain Old Java Objects)。

依賴注入(Ioc)

什麼是 Spring IOC 容器?

Spring 框架的核心是 Spring 容器。容器建立對象,將它們裝配在一塊兒,配置它們並管理它們的完整生命週期。Spring 容器使用依賴注入來管理組成應用程序的組件。容器經過讀取提供的配置元數據來接收對象進行實例化,配置和組裝的指令。該元數據能夠經過 XML,Java 註解或 Java 代碼提供。

什麼是依賴注入?

在依賴注入中,您沒必要建立對象,但必須描述如何建立它們。您不是直接在代碼中將組件和服務鏈接在一塊兒,而是描述配置文件中哪些組件須要哪些服務。由 IoC 容器將它們裝配在一塊兒。

能夠經過多少種方式完成依賴注入?

一般,依賴注入能夠經過三種方式完成,即:

  • 構造函數注入
  • setter 注入
  • 接口注入 在 Spring Framework 中,僅使用構造函數和 setter 注入。

區分構造函數注入和 setter 注入。

構造函數注入setter 注入沒有部分注入有部分注入不會覆蓋 setter 屬性會覆蓋 setter 屬性任意修改都會建立一個新實例任意修改不會建立一個新實例適用於設置不少屬性適用於設置少許屬性

spring 中有多少種 IOC 容器?

  • BeanFactory - BeanFactory 就像一個包含 bean 集合的工廠類。它會在客戶端要求時實例化 bean。
  • ApplicationContext - ApplicationContext 接口擴展了 BeanFactory 接口。它在 BeanFactory 基礎上提供了一些額外的功能。

區分 BeanFactory 和 ApplicationContext。

BeanFactoryApplicationContext它使用懶加載它使用即時加載它使用語法顯式提供資源對象它本身建立和管理資源對象不支持國際化支持國際化不支持基於依賴的註解支持基於依賴的註解

列舉 IoC 的一些好處。

IoC 的一些好處是:

  • 它將最小化應用程序中的代碼量。
  • 它將使您的應用程序易於測試,由於它不須要單元測試用例中的任何單例或 JNDI 查找機制。
  • 它以最小的影響和最少的侵入機制促進鬆耦合。
  • 它支持即時的實例化和延遲加載服務。

Spring IoC 的實現機制。

Spring 中的 IoC 的實現原理就是工廠模式加反射機制。

示例:

interface Fruit {
 public abstract void eat();
}
class Apple implements Fruit {
 public void eat(){
 System.out.println("Apple");
 }
}
class Orange implements Fruit {
 public void eat(){
 System.out.println("Orange");
 }
}
class Factory {
 public static Fruit getInstance(String ClassName) {
 Fruit f=null;
 try {
 f=(Fruit)Class.forName(ClassName).newInstance();
 } catch (Exception e) {
 e.printStackTrace();
 }
 return f;
 }
}
class Client {
 public static void main(String[] a) {
 Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
 if(f!=null){
 f.eat();
 }
 }
}
複製代碼

Beans

什麼是 spring bean?

  • 它們是構成用戶應用程序主幹的對象。
  • Bean 由 Spring IoC 容器管理。
  • 它們由 Spring IoC 容器實例化,配置,裝配和管理。
  • Bean 是基於用戶提供給容器的配置元數據建立。

spring 提供了哪些配置方式?

  • 基於 xml 配置

bean 所需的依賴項和服務在 XML 格式的配置文件中指定。這些配置文件一般包含許多 bean 定義和特定於應用程序的配置選項。它們一般以 bean 標籤開頭。例如:

<bean id="studentbean" class="org.edureka.firstSpring.StudentBean">
 <property name="name" value="Edureka"></property>
</bean>
複製代碼
  • 基於註解配置

您能夠經過在相關的類,方法或字段聲明上使用註解,將 bean 配置爲組件類自己,而不是使用 XML 來描述 bean 裝配。默認狀況下,Spring 容器中未打開註解裝配。所以,您須要在使用它以前在 Spring 配置文件中啓用它。例如:

<beans>
<context:annotation-config/>
<!-- bean definitions go here -->
</beans>
複製代碼
  • 基於 Java API 配置

Spring 的 Java 配置是經過使用 @Bean 和 @Configuration 來實現。

  1. @Bean 註解扮演與 元素相同的角色。
  2. @Configuration 類容許經過簡單地調用同一個類中的其餘 @Bean 方法來定義 bean 間依賴關係。

例如:

@Configuration
public class StudentConfig {
 @Bean
 public StudentBean myStudent() {
 return new StudentBean();
 }
}
複製代碼

spring 支持集中 bean scope?

Spring bean 支持 5 種 scope:

  • Singleton- 每一個 Spring IoC 容器僅有一個單實例。
  • Prototype- 每次請求都會產生一個新的實例。
  • Request- 每一次 HTTP 請求都會產生一個新的實例,而且該 bean 僅在當前 HTTP 請求內有效。
  • Session- 每一次 HTTP 請求都會產生一個新的 bean,同時該 bean 僅在當前 HTTP session 內有效。
  • Global-session- 相似於標準的 HTTP Session 做用域,不過它僅僅在基於 portlet 的 web 應用中才有意義。Portlet 規範定義了全局 Session 的概念,它被全部構成某個 portlet web 應用的各類不一樣的 portlet 所共享。在 global session 做用域中定義的 bean 被限定於全局 portlet Session 的生命週期範圍內。若是你在 web 中使用 global session 做用域來標識 bean,那麼 web 會自動當成 session 類型來使用。

僅當用戶使用支持 Web 的 ApplicationContext 時,最後三個纔可用。

spring bean 容器的生命週期是什麼樣的?

spring bean 容器的生命週期流程以下:

  1. Spring 容器根據配置中的 bean 定義中實例化 bean。
  2. Spring 使用依賴注入填充全部屬性,如 bean 中所定義的配置。
  3. 若是 bean 實現 BeanNameAware 接口,則工廠經過傳遞 bean 的 ID 來調用 setBeanName()。
  4. 若是 bean 實現 BeanFactoryAware 接口,工廠經過傳遞自身的實例來調用 setBeanFactory()。
  5. 若是存在與 bean 關聯的任何 BeanPostProcessors,則調用 preProcessBeforeInitialization() 方法。
  6. 若是爲 bean 指定了 init 方法( 的 init-method 屬性),那麼將調用它。
  7. 最後,若是存在與 bean 關聯的任何 BeanPostProcessors,則將調用 postProcessAfterInitialization() 方法。
  8. 若是 bean 實現 DisposableBean 接口,當 spring 容器關閉時,會調用 destory()。
  9. 若是爲 bean 指定了 destroy 方法( 的 destroy-method 屬性),那麼將調用它。

什麼是 spring 的內部 bean?

只有將 bean 用做另外一個 bean 的屬性時,才能將 bean 聲明爲內部 bean。爲了定義 bean,Spring 的基於 XML 的配置元數據在 或 中提供了 元素的使用。內部 bean 老是匿名的,它們老是做爲原型。

例如,假設咱們有一個 Student 類,其中引用了 Person 類。這裏咱們將只建立一個 Person 類實例並在 Student 中使用它。

Student.java

public class Student {
 private Person person;
 //Setters and Getters
}
public class Person {
 private String name;
 private String address;
 //Setters and Getters
}
複製代碼

bean.xml

<bean id=「StudentBean" class="com.edureka.Student"> <property name="person"> <!--This is inner bean --> <bean class="com.edureka.Person"> <property name="name" value=「Scott"></property>
 <property name="address" value=「Bangalore"></property> </bean> </property> </bean> 複製代碼

什麼是 spring 裝配

當 bean 在 Spring 容器中組合在一塊兒時,它被稱爲裝配或 bean 裝配。Spring 容器須要知道須要什麼 bean 以及容器應該如何使用依賴注入來將 bean 綁定在一塊兒,同時裝配 bean。

自動裝配有哪些方式?

Spring 容器可以自動裝配 bean。也就是說,能夠經過檢查 BeanFactory 的內容讓 Spring 自動解析 bean 的協做者。

自動裝配的不一樣模式:

  • no - 這是默認設置,表示沒有自動裝配。應使用顯式 bean 引用進行裝配。
  • byName - 它根據 bean 的名稱注入對象依賴項。它匹配並裝配其屬性與 XML 文件中由相同名稱定義的 bean。
  • byType - 它根據類型注入對象依賴項。若是屬性的類型與 XML 文件中的一個 bean 名稱匹配,則匹配並裝配屬性。
  • 構造函數 - 它經過調用類的構造函數來注入依賴項。它有大量的參數。
  • autodetect - 首先容器嘗試經過構造函數使用 autowire 裝配,若是不能,則嘗試經過 byType 自動裝配。

自動裝配有什麼侷限?

  • 覆蓋的可能性 - 您始終可使用 和 設置指定依賴項,這將覆蓋自動裝配。
  • 基本元數據類型 - 簡單屬性(如原數據類型,字符串和類)沒法自動裝配。
  • 使人困惑的性質 - 老是喜歡使用明確的裝配,由於自動裝配不太精確。

註解

你用過哪些重要的 Spring 註解?

  • @Controller - 用於 Spring MVC 項目中的控制器類。
  • @Service - 用於服務類。
  • @RequestMapping - 用於在控制器處理程序方法中配置 URI 映射。
  • @ResponseBody - 用於發送 Object 做爲響應,一般用於發送 XML 或 JSON 數據做爲響應。
  • @PathVariable - 用於將動態值從 URI 映射處處理程序方法參數。
  • @Autowired - 用於在 spring bean 中自動裝配依賴項。
  • @Qualifier - 使用 @Autowired 註解,以免在存在多個 bean 類型實例時出現混淆。
  • @Scope- 用於配置 spring bean 的範圍。
  • @Configuration,@ComponentScan和@Bean- 用於基於 java 的配置。
  • @Aspect,@Before,@After,@Around,@Pointcut- 用於切面編程(AOP)。

如何在 spring 中啓動註解裝配?

默認狀況下,Spring 容器中未打開註解裝配。所以,要使用基於註解裝配,咱們必須經過配置<context:annotation-config /> 元素在 Spring 配置文件中啓用它。

@Component, @Controller, @Repository, @Service 有何區別?

  • @Component:這將 java 類標記爲 bean。它是任何 Spring 管理組件的通用構造型。spring * 的組件掃描機制如今能夠將其拾取並將其拉入應用程序環境中。
  • @Controller:這將一個類標記爲 Spring Web MVC 控制器。標有它的 Bean 會自動導入到 IoC 容器中。
  • @Service:此註解是組件註解的特化。它不會對 @Component 註解提供任何其餘行爲。您能夠在服務層類中使用 @Service 而不是 @Component,由於它以更好的方式指定了意圖。
  • @Repository:這個註解是具備相似用途和功能的 @Component 註解的特化。它爲 DAO 提供了額外的好處。它將 DAO 導入 IoC 容器,並使未經檢查的異常有資格轉換爲 Spring DataAccessException。

@Required 註解有什麼用?

@Required 應用於 bean 屬性 setter 方法。此註解僅指示必須在配置時使用 bean 定義中的顯式屬性值或使用自動裝配填充受影響的 bean 屬性。若是還沒有填充受影響的 bean 屬性,則容器將拋出 BeanInitializationException。

示例:

public class Employee {
 private String name;
 @Required
 public void setName(String name){
 this.name=name;
 }
 public string getName(){
 return name;
 }
}
複製代碼

@Autowired 註解有什麼用?

@Autowired 能夠更準確地控制應該在何處以及如何進行自動裝配。此註解用於在 setter 方法,構造函數,具備任意名稱或多個參數的屬性或方法上自動裝配 bean。默認狀況下,它是類型驅動的注入。

public class Employee {
 private String name;
 @Autowired
 public void setName(String name) {
 this.name=name;
 }
 public string getName(){
 return name;
 }
}
複製代碼

@Qualifier 註解有什麼用?

當您建立多個相同類型的 bean 並但願僅使用屬性裝配其中一個 bean 時,您可使用@Qualifier 註解和 @Autowired 經過指定應該裝配哪一個確切的 bean 來消除歧義。

例如,這裏咱們分別有兩個類,Employee 和 EmpAccount。在 EmpAccount 中,使用@Qualifier 指定了必須裝配 id 爲 emp1 的 bean。

Employee.java

public class Employee {
 private String name;
 @Autowired
 public void setName(String name) {
 this.name=name;
 }
 public string getName() {
 return name;
 }
}
複製代碼

EmpAccount.java

public class EmpAccount {
 private Employee emp;
 @Autowired
 @Qualifier(emp1)
 public void showName() {
 System.out.println(「Employee name : 」+emp.getName);
 }
}
複製代碼

@RequestMapping 註解有什麼用?

@RequestMapping 註解用於將特定HTTP請求方法映射到將處理相應請求的控制器中的特定類/方法。此註解可應用於兩個級別:

  • 類級別:映射請求的 URL
  • 方法級別:映射 URL 以及 HTTP 請求方法

因爲篇幅緣由,關於數據訪問、AOP、MVC的經典問題將在以後的文章中持續分享出來。喜歡的朋友能夠關注下我,支持一下,感謝感謝!!

相關文章
相關標籤/搜索