Spring面試知識點

Spring中用到的設計模式

工廠模式:IOC容器
代理模式:AOP
策略模式:在spring採取動態代理時,根據代理的類有無實現接口有JDK和CGLIB兩種代理方式,就是採用策略模式實現的
單例模式:默認情況下spring中的bean只存在一個實例

肯定還有其他的,希望大家留言補上,希望大家順便看看這幾種設計模式

講講Spring中的IOC與AOP

IoC的核心是依賴反轉,將創建對象和對象之間的依賴管理交給IoC容器來做,完成對象之間的解耦。
AOP主要是利用代理模式,把許多接口都要用的又和接口本身主要的業務邏輯無關的部分抽出來,寫成一個切面,單獨維護,比如權限驗證。這樣可以使接口符合“單一職責原則”,只關注主要的業務邏輯,也提高了代碼的重用性。

AOP的應用場景


權限,日誌,處理異常,事務等等,個人理解就是把許多接口都要用的又和接口本身主要的業務邏輯無關的部分抽出來,寫成一個切面,單獨維護,比如權限驗證。這樣可以使接口符合“單一職責原則”,只關注主要的業務邏輯,也提高了代碼的重用性。

Spring中的編碼統一要如何做

配置攔截器


<filter>  
       <filter-name>CharacterEncodingFilter</filter-name>  
       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
       <init-param>  
           <param-name>encoding</param-name>  
           <param-value>UTF-8</param-value>  
       </init-param>  
       <init-param>  
           <param-name>forceEncoding</param-name>  
           <param-value>true</param-value>  
       </init-param>  
   </filter>  
   <filter-mapping>  
       <filter-name>CharacterEncodingFilter</filter-name>  
       <url-pattern>/*</url-pattern>  
   </filter-mapping>
什麼是Spring框架

Spring框架是一個爲Java應用程序的開發提供了綜合、廣泛的基礎性支持的Java平臺。Spring幫助開發者解決了開發中基礎性的問題,使得開發人員可以專注於應用程序的開發。Spring框架本身亦是按照設計模式精心打造,這使得我們可以在開發環境中安心的集成Spring框架,不必擔心Spring是如何在後臺進行工作的

Spring有哪些模塊

Spring框架至今已集成了20多個模塊。這些模塊主要被分如下圖所示的核心容器、數據訪問/集成,、Web、AOP(面向切面編程)、工具、消息和測試模塊

Spring有哪幾種配置方式

將Spring配置到應用開發中有以下三種方式:

  1. 基於XML的配置

  2. 基於註解的配置

  3. 基於Java的配置

Spring Bean的生命週期

Spring Bean的生命週期簡單易懂。在一個bean實例被初始化時,需要執行一系列的初始化操作以達到可用的狀態。同樣的,當一個bean不在被調用時需要進行相關的析構操作,並從bean容器中移除。

Spring bean factory 負責管理在spring容器中被創建的bean的生命週期。Bean的生命週期由兩組回調(call back)方法組成。

  1. 初始化之後調用的回調方法。

  2. 銷燬之前調用的回調方法。


1.Spring代理模式怎麼實現的

Java 動態代理。具體有如下四步驟:

  1. 通過實現 InvocationHandler 接口創建自己的調用處理器;

  2. 通過爲 Proxy 類指定 ClassLoader 對象和一組 interface 來創建動態代理類;

  3. 通過反射機制獲得動態代理類的構造函數,其唯一參數類型是調用處理器接口類型;

  4. 通過構造函數創建動態代理類實例,構造時調用處理器對象作爲參數被傳入。

GCLIB代理

  cglib(Code Generation Library)是一個強大的,高性能,高質量的Code生成類庫。它可以在運行期擴展Java類與實現Java接口。
  cglib封裝了asm,可以在運行期動態生成新的class。
  cglib用於AOP,jdk中的proxy必須基於接口,cglib卻沒有這個限制。

原理區別:

java動態代理是利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。而cglib動態代理是利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理。

1、如果目標對象實現了接口,默認情況下會採用JDK的動態代理實現AOP 
2、如果目標對象實現了接口,可以強制使用CGLIB實現AOP 
3、如果目標對象沒有實現了接口,必須採用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間轉換


2.Spring聲明事務管理

       聲明式事務管理建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前創建或者加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。聲明式事務最大的優點就是不需要通過編程的方式管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明(或通過基於@Transactional註解的方式),便可以將事務規則應用到業務邏輯中。


3.Spring框架有哪些模塊?

Spring框架的基本模塊如下所示:

  • Core module

  • Bean module

  • Context module

  • Expression Language module

  • JDBC module

  • ORM module

  • OXM module

  • Java Messaging Service(JMS) module

  • Transaction module

  • Web module

  • Web-Servlet module

  • Web-Struts module

  • Web-Portlet module

4.解釋核心容器(應用上下文)模塊

這是Spring的基本模塊,它提供了Spring框架的基本功能。BeanFactory 是所有Spring應用的核心。Spring框架是建立在這個模塊之上的,這也使得Spring成爲一個容器。

5.BeanFactory – BeanFactory 實例

BeanFactory是工廠模式的一種實現,它使用控制反轉將應用的配置和依賴與實際的應用代碼分離開來。

最常用的BeanFactory實現是XmlBeanFactory類。

6.XmlBeanFactory

最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory,它根據XML文件中定義的內容加載beans。該容器從XML文件中讀取配置元數據,並用它來創建一個完備的系統或應用。

7.解釋AOP模塊

AOP模塊用來開發Spring應用程序中具有切面性質的部分。該模塊的大部分服務由AOP Aliance提供,這就保證了Spring框架和其他AOP框架之間的互操作性。另外,該模塊將元數據編程引入到了Spring。

8.解釋抽象JDBC和DAO模塊

通過使用抽象JDBC和DAO模塊保證了與數據庫連接代碼的整潔與簡單,同時避免了由於未能關閉數據庫資源引起的問題。它在多種數據庫服務器的錯誤信息之上提供了一個很重要的異常層。它還利用Spring的AOP模塊爲Spring應用程序中的對象提供事務管理服務。

9.解釋對象/關係映射集成模塊

Spring通過提供ORM模塊在JDBC的基礎上支持對象關係映射工具。這樣的支持使得Spring可以集成主流的ORM框架,包括Hibernate, JDO, 及iBATIS SQL Maps。Spring的事務管理可以同時支持以上某種框架和JDBC。

10.解釋web模塊

Spring的web模塊建立在應用上下文(application context)模塊之上,提供了一個適合基於web應用程序的上下文環境。該模塊還支持了幾個面向web的任務,如透明的處理多文件上傳請求及將請求參數同業務對象綁定起來。

11.解釋Spring MVC模塊

Spring提供MVC框架構建web應用程序。Spring可以很輕鬆的同其他MVC框架結合,但Spring的MVC是個更好的選擇,因爲它通過控制反轉將控制邏輯和業務對象完全分離開來。

12.Spring的配置文件

Spring的配置文件是一個XML文件,文件包含了類信息並描述了這些類是如何配置和互相調用的。

13.Spring IoC容器是什麼?

Spring IOC負責創建對象、管理對象(通過依賴注入)、整合對象、配置對象以及管理這些對象的生命週期。

14.IOC有什麼優點?

IOC或依賴注入減少了應用程序的代碼量。它使得應用程序的測試很簡單,因爲在單元測試中不再需要單例或JNDI查找機制。簡單的實現以及較少的干擾機制使得鬆耦合得以實現。IOC容器支持勤性單例及延遲加載服務。

15.應用上下文是如何實現的?

FileSystemXmlApplicationContext 容器加載XML文件中beans的定義。XML Bean配置文件的完整路徑必須傳遞給構造器。

FileSystemXmlApplicationContext 容器也加載XML文件中beans的定義。注意,你需要正確的設置CLASSPATH,因爲該容器會在CLASSPATH中查看bean的XML配置文件。

WebXmlApplicationContext:該容器加載xml文件,這些文件定義了web應用中所有的beans。

16.Bean Factory和ApplicationContext?

ApplicationContext提供了一種解決文檔信息的方法,一種加載文件資源的方式(如圖片),他們可以向監聽他們的beans發送消息。另外,容器或者容器中beans的操作,這些必須以bean工廠的編程方式處理的操作可以在應用上下文中以聲明的方式處理。應用上下文實現了MessageSource,該接口用於獲取本地消息,實際的實現是可選的。

17.Spring應用程序看起來像什麼?
  • 一個定義功能的接口

  • 實現包括屬性,setter和getter方法,功能等

  • Spring AOP

  • Spring的XML配置文件

  • 使用該功能的客戶端編程

依賴注入

18.Spring中的依賴注入是什麼?

依賴注入作爲控制反轉(IOC)的一個層面,可以有多種解釋方式。在這個概念中,你不用創建對象而只需要描述如何創建它們。你不必通過代碼直接的將組件和服務連接在一起,而是通過配置文件說明哪些組件需要什麼服務。之後IOC容器負責銜接。

19.有哪些不同類型的IOC(依賴注入)?
  • 構造器依賴注入:構造器依賴注入在容器觸發構造器的時候完成,該構造器有一系列的參數,每個參數代表注入的對象。

  • Setter方法依賴注入:首先容器會觸發一個無參構造函數或無參靜態工廠方法實例化對象,之後容器調用bean中的setter方法完成Setter方法依賴注入。

20.你推薦哪種依賴注入?

你可以同時使用兩種方式的依賴注入,最好的選擇是使用構造器參數實現強制依賴注入,使用setter方法實現可選的依賴關係。

Spring Beans

21.什麼是Spring Beans?

Spring Beans是構成Spring應用核心的Java對象。這些對象由Spring IOC容器實例化、組裝、管理。這些對象通過容器中配置的元數據創建,例如,使用XML文件中定義的創建。

在Spring中創建的beans都是單例的beans。在bean標籤中有一個屬性爲”singleton”,如果設爲true,該bean是單例的,如果設爲false,該bean是原型bean。Singleton屬性默認設置爲true。因此,spring框架中所有的bean都默認爲單例bean。

22.Spring Bean中定義了什麼內容?

Spring Bean中定義了所有的配置元數據,這些配置信息告知容器如何創建它,它的生命週期是什麼以及它的依賴關係。

23.如何向Spring 容器提供配置元數據?

有三種方式向Spring 容器提供元數據:

  • XML配置文件

  • 基於註解配置

  • 基於Java的配置

24.你如何定義bean的作用域?

在Spring中創建一個bean的時候,我們可以聲明它的作用域。只需要在bean定義的時候通過’scope’屬性定義即可。例如,當Spring需要產生每次一個新的bean實例時,應該聲明bean的scope屬性爲prototype。如果每次你希望Spring返回一個實例,應該聲明bean的scope屬性爲singleton。

25.說一下Spring中支持的bean作用域

Spring框架支持如下五種不同的作用域:

  • singleton:在Spring IOC容器中僅存在一個Bean實例,Bean以單實例的方式存在。

  • prototype:一個bean可以定義多個實例。

  • request:每次HTTP請求都會創建一個新的Bean。該作用域僅適用於WebApplicationContext環境。

  • session:一個HTTP Session定義一個Bean。該作用域僅適用於WebApplicationContext環境.

  • globalSession:同一個全局HTTP Session定義一個Bean。該作用域同樣僅適用於WebApplicationContext環境.

bean默認的scope屬性是’singleton‘。

26.Spring框架單例beans線程安全嗎?

不是,Spring框架中的單例beans不是線程安全的。

27.解釋Spring框架中bean的生命週期
  • Spring容器讀取XML文件中bean的定義並實例化bean。

  • Spring根據bean的定義設置屬性值。

  • 如果該Bean實現了BeanNameAware接口,Spring將bean的id傳遞給setBeanName()方法。

  • 如果該Bean實現了BeanFactoryAware接口,Spring將beanfactory傳遞給setBeanFactory()方法。

  • 如果任何bean BeanPostProcessors 和該bean相關,Spring調用postProcessBeforeInitialization()方法。

  • 如果該Bean實現了InitializingBean接口,調用Bean中的afterPropertiesSet方法。如果bean有初始化函數聲明,調用相應的初始化方法。

  • 如果任何bean BeanPostProcessors 和該bean相關,調用postProcessAfterInitialization()方法。

  • 如果該bean實現了DisposableBean,調用destroy()方法。

28.哪些是最重要的bean生命週期方法?

有兩個重要的bean生命週期方法。第一個是setup方法,該方法在容器加載bean的時候被調用。第二個是teardown方法,該方法在bean從容器中移除的時候調用。

bean標籤有兩個重要的屬性(init-method 和 destroy-method),你可以通過這兩個屬性定義自己的初始化方法和析構方法。Spring也有相應的註解:@PostConstruct 和 @PreDestroy。

29.什麼是Spring的內部bean?

當一個bean被用作另一個bean的屬性時,這個bean可以被聲明爲內部bean。在基於XML的配置元數據中,可以通過把元素定義在 或元素內部實現定義內部bean。內部bean總是匿名的並且它們的scope總是prototype。

30.如何在Spring中注入Java集合類?

Spring提供如下幾種類型的集合配置元素:

  • list元素用來注入一系列的值,允許有相同的值。

  • set元素用來注入一些列的值,不允許有相同的值。

  • map用來注入一組”鍵-值”對,鍵、值可以是任何類型的。

  • props也可以用來注入一組”鍵-值”對,這裏的鍵、值都字符串類型。

31.什麼是bean wiring?

Wiring,或者說bean Wiring是指beans在Spring容器中結合在一起的情況。當裝配bean的時候,Spring容器需要知道需要哪些beans以及如何使用依賴注入將它們結合起來。

32.什麼是bean自動裝配?

Spring容器可以自動配置相互協作beans之間的關聯關係。這意味着Spring可以自動配置一個bean和其他協作bean之間的關係,通過檢查BeanFactory 的內容裏沒有使用和< property>元素。

33.解釋自動裝配的各種模式?

自動裝配提供五種不同的模式供Spring容器用來自動裝配beans之間的依賴注入:

  • no:默認的方式是不進行自動裝配,通過手工設置ref 屬性來進行裝配bean。

  • byName:通過參數名自動裝配,Spring容器查找beans的屬性,這些beans在XML配置文件中被設置爲byName。之後容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。

  • byType:通過參數的數據類型自動自動裝配,Spring容器查找beans的屬性,這些beans在XML配置文件中被設置爲byType。之後容器試圖匹配和裝配和該bean的屬性類型一樣的bean。如果有多個bean符合條件,則拋出錯誤。

  • constructor:這個同byType類似,不過是應用於構造函數的參數。如果在BeanFactory中不是恰好有一個bean與構造函數參數相同類型,則拋出一個嚴重的錯誤。

  • autodetect:如果有默認的構造方法,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配。

34.自動裝配有哪些侷限性?

自動裝配有如下侷限性:

  • 重寫:你仍然需要使用 和< property>設置指明依賴,這意味着總要重寫自動裝配。

  • 原生數據類型:你不能自動裝配簡單的屬性,如原生類型、字符串和類。

  • 模糊特性:自動裝配總是沒有自定義裝配精確,因此,如果可能儘量使用自定義裝配。

35.可以在Spring中注入null或空字符串嗎

完全可以。

Spring註解

36.什麼是Spring基於Java的配置?

基於Java的配置允許你使用Java的註解進行Spring的大部分配置而非通過傳統的XML文件配置。

以註解@Configuration爲例,它用來標記類,說明作爲beans的定義,可以被Spring IOC容器使用。另一個例子是@Bean註解,它表示該方法定義的Bean要被註冊進Spring應用上下文中。

37.什麼是基於註解的容器配置?

另外一種替代XML配置的方式爲基於註解的配置,這種方式通過字節元數據裝配組件而非使用尖括號聲明。開發人員將直接在類中進行配置,通過註解標記相關的類、方法或字段聲明,而不再使用XML描述bean之間的連線關係。

38.如何開啓註解裝配?

註解裝配默認情況下在Spring容器中是不開啓的。如果想要開啓基於註解的裝配只需在Spring配置文件中配置元素即可。

39.@Required 註解

@Required表明bean的屬性必須在配置時設置,可以在bean的定義中明確指定也可通過自動裝配設置。如果bean的屬性未設置,則拋出BeanInitializationException異常。

40.@Autowired 註解

@Autowired 註解提供更加精細的控制,包括自動裝配在何處完成以及如何完成。它可以像@Required一樣自動裝配setter方法、構造器、屬性或者具有任意名稱和/或多個參數的PN方法。

41. @Qualifier 註解

當有多個相同類型的bean而只有其中的一個需要自動裝配時,將@Qualifier 註解和@Autowire 註解結合使用消除這種混淆,指明需要裝配的bean。

Spring數據訪問

42.Spring框架中如何有效的使用JDBC

使用Spring JDBC框架,資源管理以及錯誤處理的代價都會減輕。開發人員只需通過statements和queries語句從數據庫中存取數據。Spring框架中通過使用模板類能更有效的使用JDBC,也就是所謂的JdbcTemplate(例子)。

43.JdbcTemplate

JdbcTemplate類提供了許多方法,爲我們與數據庫的交互提供了便利。例如,它可以將數據庫的數據轉化爲原生類型或對象,執行寫好的或可調用的數據庫操作語句,提供自定義的數據庫錯誤處理功能。

44.Spring對DAO的支持

Spring對數據訪問對象(DAO)的支持旨在使它可以與數據訪問技術(如 JDBC, Hibernate 及JDO)方便的結合起來工作。這使得我們可以很容易在的不同的持久層技術間切換,編碼時也無需擔心會拋出特定技術的異常。

45.通過什麼方式訪問Hibernate?

使用Spring有兩種方式訪問Hibernate:

  • 使用Hibernate Template的反轉控制以及回調方法

  • 繼承HibernateDAOSupport,並申請一個AOP攔截器節點

46.Spring支持的ORM

Spring支持一下ORM:

  • Hibernate

  • iBatis

  • JPA (Java -Persistence API)

  • TopLink

  • JDO (Java Data Objects)

  • OJB

47.Spring和Hibernate結合起來

使用Spring的SessionFactory 調用LocalSessionFactory。結合過程分爲以下三步:

  • 配置Hibernate SessionFactory

  • 繼承HibernateDaoSupport實現一個DAO

  • 使用AOP裝載事務支持

48.Spring支持的事務管理類型

Spring支持如下兩種方式的事務管理:

  • 編程式事務管理:這意味着你可以通過編程的方式管理事務,這種方式帶來了很大的靈活性,但很難維護。

  • 聲明式事務管理:這種方式意味着你可以將事務管理和業務代碼分離。你只需要通過註解或者XML配置管理事務。

49.Spring框架的事務管理有哪些優點?
  • 它爲不同的事務API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統一的編程模型。

  • 它爲編程式事務管理提供了一個簡單的API而非一系列複雜的事務API(如JTA).

  • 它支持聲明式事務管理。

  • 它可以和Spring 的多種數據訪問技術很好的融合。

50.你更推薦那種類型的事務管理?

許多Spring框架的用戶選擇聲明式事務管理,因爲這種方式和應用程序的關聯較少,因此更加符合輕量級容器的概念。聲明式事務管理要優於編程式事務管理,儘管在靈活性方面它弱於編程式事務管理(這種方式允許你通過代碼控制業務)。

Spring面向切面編程(AOP)

51.解釋AOP

面向切面編程,或AOP允許程序員模塊化橫向業務邏輯,或定義核心部分的功能,例如日誌管理和事務管理。

52.切面(Aspect)

AOP的核心就是切面,它將多個類的通用行爲封裝爲可重用的模塊。該模塊含有一組API提供 cross-cutting功能。例如,日誌模塊稱爲日誌的AOP切面。根據需求的不同,一個應用程序可以有若干切面。在Spring AOP中,切面通過帶有@Aspect註解的類實現。

53.concern和 cross-cutting concern

Concern(核心邏輯):表示在應用程序中一個模塊的行爲。Concern可以定義爲我們想要實現的功能。

Cross-cutting concern(橫向的通用邏輯):指的是整個應用程序都會用到的功能,它影響整個應用程序。例如,日誌管理(Logging)、安全管理(Security)以及數據交互是應用程序的每個模塊都要涉及到的,因此這些都屬於Cross-cutting concern。

54.連接點(Join point)

連接點代表應用程序中插入AOP切面的地點。它實際上是Spring AOP框架在應用程序中執行動作的地點。

55.通知(Advice)

通知表示在方法執行前後需要執行的動作。實際上它是Spring AOP框架在程序執行過程中觸發的一些代碼。

Spring切面可以執行一下五種類型的通知:

  • before(前置通知):在一個方法之前執行的通知。

  • after(最終通知):當某連接點退出的時候執行的通知(不論是正常返回還是異常退出)。

  • after-returning(後置通知):在某連接點正常完成後執行的通知。

  • after-throwing(異常通知):在方法拋出異常退出時執行的通知。

  • around(環繞通知):在方法調用前後觸發的通知。

56.切入點(Pointcut)

切入點是一個或一組連接點,通知將在這些位置執行。可以通過表達式或匹配的方式指明切入點。

57.什麼是引入?

引入允許我們在已有的類上添加新的方法或屬性。

58.什麼是目標對象?

被一個或者多個切面所通知的對象。它通常是一個代理對象。也被稱做被通知(advised)對象。

59.什麼是代理?

代理是將通知應用到目標對象後創建的對象。從客戶端的角度看,代理對象和目標對象是一樣的。

60.有幾種不同類型的自動代理?
  • BeanNameAutoProxyCreator:bean名稱自動代理創建器

  • DefaultAdvisorAutoProxyCreator:默認通知者自動代理創建器

  • Metadata autoproxying:元數據自動代理

61.什麼是織入應用的不同點?

織入是將切面和其他應用類型或對象連接起來創建一個通知對象的過程。織入可以在編譯、加載或運行時完成。

62.解釋基於XML Schema方式的切面實現

在這種情況下,切面由使用XML文件配置的類實現。

63.基於註解方式(基於@AspectJ)的切面

在這種情況下(基於@AspectJ的實現),指的是切面的對應的類使用Java 5註解的聲明方式。

Spring的MVC框架

64.什麼是Spring的MVC框架?

Spring提供了一個功能齊全的MVC框架用於構建Web應用程序。Spring框架可以很容易的和其他的MVC框架融合(如Struts),該框架使用控制反轉(IOC)將控制器邏輯和業務對象分離開來。它也允許以聲明的方式綁定請求參數到業務對象上。

65.DispatcherServlet

Spring的MVC框架圍繞DispatcherServlet來設計的,它用來處理所有的HTTP請求和響應。

66.WebApplicationContext

WebApplicationContext繼承了ApplicationContext,並添加了一些web應用程序需要的功能。和普通的ApplicationContext 不同,WebApplicationContext可以用來處理主題樣式,它也知道如何找到相應的servlet。

67.什麼是Spring MVC框架的控制器?

控制器提供對應用程序行爲的訪問,通常通過服務接口實現。控制器解析用戶的輸入,並將其轉換爲一個由視圖呈現給用戶的模型。Spring 通過一種極其抽象的方式實現控制器,它允許用戶創建多種類型的控制器。

68.@Controller annotation

@Controller註解表示該類扮演控制器的角色。Spring不需要繼承任何控制器基類或應用Servlet API。

69.@RequestMapping annotation

@RequestMapping註解用於將URL映射到任何一個類或者一個特定的處理方法上。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章