《27道大廠高頻Spring面試題,95%的人答不上》

《27道大廠高頻Spring面試題,95%的人答不上》java

本文節選自《Spring5核心原理與30個類手寫實戰》一書,譚勇德(Tom)著,電子工業出版社出版。本書基於編程開發實踐,不只深度解析Spring 5的原理與新特性,更從環境準備、頂層結構設計、數據訪問等方面一步步地推導出Spring的設計原理。在每一個知識點上,均以大量的經典代碼案例輔助講解,使理論緊密聯繫實際。最後手寫30個類,以體會Spring做者的創做過程,讓每一位讀者學以至用。web

1  什麼是Spring框架?Spring框架有哪些主要模塊?面試

Spring框架是一個爲Java應用程序開發提供綜合、普遍的基礎性支持的Java平臺。Spring幫助開發者解決了開發中基礎性的問題,使得開發人員能夠專一於應用程序的開發。Spring框架自己也是按照設計模式精心打造,這使得咱們能夠在開發環境中安心地集成Spring框架,沒必要擔憂Spring是如何在後臺工做的。spring

Spring大約18個基本模塊,大體分爲4類;分別是核心模塊、AOP、數據訪問、Web模塊、測試模塊。數據庫

核心模塊包括:core、beans、context、context-support、expression共5個模塊;express

AOP模塊包括:aop、aspects、instrument共3個模塊;編程

數據訪問模塊包括:jdbc、tx、orm、oxm共4個模塊;json

Web模塊包括:web、webmvc、websocket、webflux共4個模塊;設計模式

集成測試模塊:test模塊。安全

 

2  使用Spring框架能帶來哪些好處?

下面列舉了一些使用Spring框架帶來的主要好處。

(1)Dependency Injection(DI) 方法使得構造器和JavaBean properties文件中的依賴關係一目瞭然。

(2)與EJB容器相比較,IOC容器更加趨向於輕量級。這樣一來IOC容器在有限的內存和CPU資源的狀況下進行應用程序的開發和發佈就變得十分有利。

(3)Spring並無閉門造車,Spring利用了已有的技術,好比ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其餘視圖技術。

(4)Spring框架是按照模塊的形式來組織的。由包和類的編號就能夠看出其所屬的模塊,開發者只需選用他們須要的模塊便可。

(5)要測試一項用Spring開發的應用程序十分簡單,由於測試相關的環境代碼都已經囊括在框架中了。更加簡單的是,利用JavaBean形式的POJO類,能夠很方便地利用依賴注入來寫入測試數據。

(6)Spring的Web框架也是一個精心設計的Web MVC框架,爲開發者們在Web框架的選擇上提供了一個除主流框架好比Struts、過分設計的、不流行Web框架之外的選擇。

(7)Spring提供了一個便捷的事務管理接口,適用於小型的本地事務處理(好比在單DB的環境下)和複雜的共同事務處理(好比利用JTA的複雜DB環境)。

3  什麼是控制反轉(IOC)?什麼是依賴注入?

(1)控制反轉是應用於軟件工程領域的,在運行時被裝配器對象用來綁定耦合對象的一種編程技巧,對象之間的耦合關係在編譯時一般是未知的。在傳統的編程方式中,業務邏輯的流程是由應用程序中早已被設定好關聯關係的對象來決定的。在使用控制反轉的狀況下,業務邏輯的流程是由對象關係圖來決定的,該對象關係圖由裝配器負責實例化,這種實現方式還能夠將對象之間的關聯關係的定義抽象化。綁定的過程是經過「依賴注入」實現的。

(2)控制反轉是一種以給予應用程序中目標組件更多控制爲目的設計範式,並在咱們的實際工做中起到了有效的做用。

(3)依賴注入是在編譯階段還沒有知所需的功能是來自哪一個的類的狀況下,將其餘對象所依賴的功能對象實例化的模式。這就須要一種機制用來激活相應的組件以提供特定的功能,因此依賴注入是控制反轉的基礎。不然若是在組件不受框架控制的狀況下,框架又怎麼知道要建立哪一個組件呢?

4  在Java中依賴注入有哪些方式?

(1)構造器注入。

(2)Setter方法注入。

(3)接口注入。

5  BeanFactory和ApplicationContext有什麼區別?

BeanFactory 能夠理解爲含有Bean集合的工廠類。BeanFactory 包含了bean的定義,以便在接收到客戶端請求時將對應的Bean實例化。

BeanFactory還能在實例化對象時生成協做類之間的關係。此舉將Bean自身從Bean客戶端的配置中解放出來。BeanFactory還包含Bean生命週期的控制,調用客戶端的初始化方法(initialization Methods)和銷燬方法(destruction Methods)。

從表面上看,ApplicationContext如同Bean Factory同樣具備Bean定義、Bean關聯關係的設置,以及根據請求分發Bean的功能。但ApplicationContext在此基礎上還提供了其餘功能。 

(1)提供了支持國際化的文本消息。

(2)統一的資源文件讀取方式。

(3)已在監聽器中註冊的Bean的事件。

如下是三種較常見的 ApplicationContext 實現方式。

(1)ClassPathXmlApplicationContext:從classpath的XML配置文件中讀取上下文,並生成上下文定義。應用程序上下文從程序環境變量中取得。 

ApplicationContext context = new ClassPathXmlApplicationContext(「application.xml」); 

 

(2)FileSystemXmlApplicationContext :由文件系統中的XML配置文件讀取上下文。 

ApplicationContext context = new FileSystemXmlApplicationContext(「application.xml」); 

 

(3)XmlWebApplicationContext:由Web應用的XML文件讀取上下文。

6  Spring提供幾種配置方式來設置元數據?

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

(1)基於XML的配置。

(2)基於註解的配置。

(3)基於Java的配置。

7  如何使用XML配置的方式配置Spring?

在Spring框架中,依賴和服務須要專門的配置文件中實現,我通常用XML格式的配置文件。這些配置文件的格式採用通公共的模板,由一系列的Bean定義和專門的應用配置選項組成。 

Spring XML配置的主要目的是使全部的Spring組件均可以用XML文件的形式來進行配置。這意味着不會出現其餘的Spring配置類型(好比聲明的方式或基於Java Class的配置方式)。

Spring的XML配置方式是使用被Spring命名空間所支持的一系列的XML標籤來實現的。Spring有如下主要的命名空間:context、beans、jdbc、tx、aop、mvc和aso。

<beans>

   <!-- JSON Support -->

   <bean name="viewResolver"

        class="org.springframework.web.servlet.view.BeanNameViewResolver"/>

   <bean name="jsonTemplate"

        class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>

   <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>

</beans>

 

下面這個web.xml僅配置了DispatcherServlet,這最簡單的配置便能知足應用程序配置運行時組件的需求。

<web-app>

   <display-name>Archetype Created Web Application</display-name>

   <servlet>

      <servlet-name>spring</servlet-name>

      <servlet-class>

         org.springframework.web.servlet.DispatcherServlet

      </servlet-class>

      <load-on-startup>1</load-on-startup>

   </servlet>

   <servlet-mapping>

      <servlet-name>spring</servlet-name>

      <url-pattern>/</url-pattern>

   </servlet-mapping>

</web-app>

8  Spring提供哪些配置形式?

Spring對Java配置的支持是由@Configuration註解和@Bean註解來實現的。由@Bean註解的方法將會實例化、配置和初始化一個新對象,這個對象將由Spring的IOC容器來管理。@Bean聲明所起到的做用與元素相似。被@Configuration所註解的類則表示這個類的主要目的是做爲Bean定義的資源。被@Configuration聲明的類能夠經過在同一個類的內部調用@bean方法來設置嵌入Bean的依賴關係。 

最簡單的@Configuration 聲明類請參考下面的代碼:

@Configuration

public class AppConfig{

   @Bean

   public MyService myService() {

      return new MyServiceImpl();

   }

}

 

與上面的@Beans配置文件相同的XML配置文件以下:

<beans>

   <bean id="myService" class="com.gupaoedu.services.MyServiceImpl"/>

</beans>

上述配置方式的實例化方式以下:

public static void main(String[] args) {

   ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);

   MyService myService = ctx.getBean(MyService.class);

   myService.doStuff();

}

 

要使用組件組建掃描,僅需用@Configuration進行註解便可:

@Configuration

@ComponentScan(basePackages = "com.gupaoedu")

public class AppConfig  {

}

 

在上面的例子中,com.gupaoedu包首先會被掃描到,而後在容器內查找被@Component 聲明的類,找到後將這些類按照Spring Bean定義進行註冊。 

若是你要在Web應用開發中選用上述配置方式,須要用AnnotationConfigWebApplicationContext類來讀取配置文件,能夠用來配置Spring的Servlet監聽器ContrextLoaderListener或者Spring MVC的DispatcherServlet。

<web-app>

   <context-param>

      <param-name>contextClass</param-name>

      <param-value>

         org.springframework.web.context.support.AnnotationConfigWebApplicationContext

      </param-value>

   </context-param>

   <context-param>

      <param-name>contextConfigLocation</param-name>

      <param-value>com.gupaoedu.AppConfig</param-value>

   </context-param>

   <listener>

      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

   </listener>

   <servlet>

      <servlet-name>dispatcher</servlet-name>

      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

      <init-param>

         <param-name>contextClass</param-name>

         <param-value>

            org.springframework.web.context.support.AnnotationConfigWebApplicationContext

         </param-value>

      </init-param>

      <init-param>

         <param-name>contextConfigLocation</param-name>

         <param-value>com.gupaoedu.web.MVCConfig</param-value>

      </init-param>

   </servlet>

   <servlet-mapping>

      <servlet-name>dispatcher</servlet-name>

      <url-pattern>/web/*</url-pattern>

   </servlet-mapping>

</web-app>

9  怎樣用註解的方式配置Spring?

Spring在2.5版本之後開始支持用註解的方式來配置依賴注入。能夠用註解的方式來替代XML方式的Bean描述,能夠將Bean描述轉移到組件類的內部,只須要在相關類上、方法上或者字段聲明上使用註解便可。註解注入將會被容器在XML注入以前處理,因此後者會覆蓋前者對於同一個屬性的處理結果。

註解裝配在Spring中是默認關閉的,須要在Spring文件中配置一下才能使用基於註解的裝配模式。若是你想要在應用程序中使用註解的方式,請參考以下配置:

<beans>

   <context:annotation-config/>

</beans>

 

標籤配置完成之後,就能夠用註解的方式在Spring中向屬性、方法和構造方法中自動裝配變量。

下面是幾種比較重要的註解類型。

(1)@Required:該註解應用於設值方法。 

(2)@Autowired:該註解應用於有值設值方法、非設值方法、構造方法和變量。 

(3)@Qualifier:該註解和@Autowired註解搭配使用,用於消除特定Bean自動裝配的歧義。 

(4)JSR-250 Annotations:Spring支持基於JSR-250 註解的註解,@Resource、@PostConstruct 和 @PreDestroy。

10  請解釋Spring Bean的生命週期?

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

Spring Bean Factory 負責管理在Spring容器中被建立的Bean的生命週期。Bean的生命週期由兩組回調方法組成。 

(1)初始化以後調用的回調方法。 

(2)銷燬以前調用的回調方法。 

Spring框架提供瞭如下四種方式來管理Bean的生命週期事件:

(1)InitializingBean和DisposableBean回調接口。

(2)針對特殊行爲的其餘Aware接口。

(3)Bean配置文件中的Custom init()方法和destroy()方法。

(4)@PostConstruct和@PreDestroy註解方式。

使用customInit()和 customDestroy()方法管理Bean生命週期的代碼樣例以下:

<beans>

   <bean id="demoBean" class="com.gupaoedu.task.DemoBean"

        init-Method="customInit" destroy-Method="customDestroy">

   </bean>

</beans>

11  Spring Bean做用域的區別是什麼?

Spring容器中的Bean能夠分爲5個範圍。全部範圍的名稱都是自說明的,可是爲了不混淆,仍是讓咱們來解釋一下。

(1)singleton:這種Bean範圍是默認的,這種範圍確保無論接收到多少個請求,每一個容器中只有一個Bean的實例,單例的模式由Bean Factory自身來維護。 

(2)prototype:原形範圍與單例範圍相反,爲每個Bean請求提供一個實例。 

(3)request:在請求Bean範圍內爲每個來自客戶端的網絡請求建立一個實例,在請求完成之後,Bean會失效並被垃圾回收器回收。 

(4)Session:與請求範圍相似,確保每一個Session中有一個Bean的實例,在Session過時後,Bean會隨之失效。

(5)global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中時,它包含不少portlet。若是你想要聲明讓全部的portlet共用全局的存儲變量,那麼這個全局變量須要存儲在global-session中。全局做用域與Servlet中的Session做用域效果相同。

12  什麼是Spring Inner Bean?

在Spring框架中,不管什麼時候Bean被使用時,當僅被調用了一個屬性,一個明智的作法是將這個Bean聲明爲內部Bean。內部Bean能夠用setter注入「屬性」和用構造方法注入「構造參數」的方式來實現。

好比,在咱們的應用程序中,一個Customer類引用了一個Person類,咱們要作的是建立一個Person的實例,而後在Customer內部使用。

public class Customer{

   private Person person;

}

public class Person{

   private String name;

   private String address;

   private int age;

}

 

內部Bean的聲明方式以下:

<bean id="CustomerBean" class="com.gupaoedu.common.Customer">

   <property name="person">

      <bean class="com.gupaoedu.common.Person">

         <property name="name" value="lokesh" />

         <property name="address" value="India" />

         <property name="age" value="34" />

      </bean>

   </property>

</bean>

13  Spring框架中的單例Bean是線程安全的嗎?

Spring框架並無對單例Bean進行任何多線程的封裝處理。關於單例Bean的線程安全和併發問題須要開發者自行搞定。但實際上,大部分Spring Bean並無可變的狀態(好比Serview類和DAO類),因此在某種程度上說,Spring的單例Bean是線程安全的。若是你的Bean有多種狀態(好比View Model對象),就須要自行保證線程安全。

最淺顯的解決辦法就是將多態Bean的做用域由「singleton」變動爲「prototype」。

14  請舉例說明如何在Spring中注入一個Java 集合?

Spring提供瞭如下四種集合類的配置元素:

(1)<list>標籤用來裝配可重複的list值。 

(2)<set>標籤用來裝配沒有重複的set值。 

(3)<map>標籤可用來注入鍵和值,能夠爲任何類型的鍵值對。 

(4)<props>標籤支持注入鍵和值都是字符串類型的鍵值對。 

下面看一下具體的例子:

<beans>

   <bean id="javaCollection" class="com.gupaoedu.JavaCollection">

      <property name="customList">

         <list>

            <value>INDIA</value>

            <value>Pakistan</value>

            <value>USA</value>

            <value>UK</value>

         </list>

      </property>

      <property name="customSet">

         <set>

            <value>INDIA</value>

            <value>Pakistan</value>

            <value>USA</value>

            <value>UK</value>

         </set>

      </property>

      <property name="customMap">

         <map>

            <entry key="1" value="INDIA"/>

            <entry key="2" value="Pakistan"/>

            <entry key="3" value="USA"/>

            <entry key="4" value="UK"/>

         </map>

      </property>

      <property name="customProperies">

         <props>

            <prop key="admin">admin@gupaoedu.com</prop>

            <prop key="support">support@gupaoedu.com</prop>

         </props>

      </property>

   </bean>

</beans>

15  如何向Spring Bean中注入java.util.Properties?

第一種方法是使用以下面代碼所示的標籤:

<bean id="adminUser" class="com.gupaoedu.common.Customer">

   <property name="emails">

      <props>

         <prop key="admin">admin@gupaoedu.com</prop>

         <prop key="support">support@gupaoedu.com</prop>

      </props>

   </property>

</bean>

 

也可用「util:」命名空間來從properties文件中建立一個propertiesbean,而後利用setter方法注入Bean的引用。

16  請解釋Spring Bean的自動裝配?

在Spring框架中,在配置文件中設定Bean的依賴關係是一個很好的機制,Spring容器還能夠自動裝配合做關係Bean之間的關聯關係。這意味着Spring能夠經過向Bean Factory中注入的方式自動搞定Bean之間的依賴關係。自動裝配能夠設置在每一個Bean上,也能夠設定在特定的Bean上。

下面的XML配置文件代表瞭如何根據名稱將一個Bean設置爲自動裝配:

<bean id="employeeDAO" class="com.gupaoedu.EmployeeDAOImpl" autowire="byName" />

 

除了Bean配置文件中提供的自動裝配模式,還可使用@Autowired註解來自動裝配指定的Bean。在使用@Autowired註解以前須要按照以下的配置方式在Spring配置文件中進行配置。

<context:annotation-config />

 

也能夠經過在配置文件中配置AutowiredAnnotationBeanPostProcessor 達到相同的效果。

<bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

配置好之後就可使用@Autowired來標註了。

@Autowired

public EmployeeDAOImpl ( EmployeeManager manager ) {

      this.manager = manager;

}

17  自動裝配有哪些侷限性?

自動裝配有以下侷限性。

  1. 重寫:你仍然須要使用和< property>設置指明依賴,這意味着總要重寫自動裝配。
  2. 原生數據類型:你不能自動裝配簡單的屬性,如原生類型、字符串和類。
  3. 模糊特性:自動裝配老是沒有自定義裝配精確,所以若是可能儘可能使用自定義裝配。

18  請解釋各類自動裝配模式的區別?

在Spring框架中共有5種自動裝配,讓咱們逐一分析。 

(1)no:這是Spring框架的默認設置,在該設置下自動裝配是關閉的,開發者須要自行在Bean定義中用標籤明確地設置依賴關係。

(2)byName:該選項能夠根據Bean名稱設置依賴關係。當向一個Bean中自動裝配一個屬性時,容器將根據Bean的名稱自動在配置文件中查詢一個匹配的Bean。若是找到就裝配這個屬性,若是沒找到就報錯。

(3)byType:該選項能夠根據Bean類型設置依賴關係。當向一個Bean中自動裝配一個屬性時,容器將根據Bean的類型自動在配置文件中查詢一個匹配的Bean。若是找到就裝配這個屬性,若是沒找到就報錯。

(4)constructor:它的自動裝配和byType模式相似,可是僅適用於有與構造器相同參數的Bean,若是在容器中沒有找到與構造器參數類型一致的Bean,那麼將會拋出異常。

(5)autodetect:該模式自動探測使用構造器自動裝配或者byType自動裝配。首先會嘗試找合適的帶參數的構造器,若是找到就是用構造器自動裝配,若是在Bean內部沒有找到相應的構造器或者是無參構造器,容器就會自動選擇byTpe的自動裝配方式。

19  請舉例解釋@Required Annotation?

在產品級別的應用中,IOC容器可能聲明瞭數十萬了Bean,Bean與Bean之間有着複雜的依賴關係。設值註解方法的短板之一就是驗證全部的屬性是否被註解是一項十分困難的操做。能夠經過設置「dependency-check」來解決這個問題。

在應用程序的生命週期中,你可能不大願意花時間驗證全部Bean的屬性是否按照上下文文件正確配置。或者你寧肯驗證某個Bean的特定屬性是否被正確設置。即便用「dependency-check」屬性也不能很好地解決這個問題,在這種狀況下你須要使用@Required 註解。 

須要用以下的方式使用來標明Bean的設值方法。

public class EmployeeFactoryBean extends AbstractFactoryBean<Object> {

   private String designation;

   public String getDesignation() {

      return designation;

   }

   @Required

   public void setDesignation(String designation) {

      this.designation = designation;

   }

}

 

RequiredAnnotationBeanPostProcessor是Spring中的後置處理器,用來驗證被@Required 註解的Bean屬性是否被正確設置了。在使用RequiredAnnotationBeanPostProcesso驗證Bean屬性以前,要在IOC容器中對其進行註冊:

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />

 

可是若是沒有屬性被用@Required註解過,後置處理器會拋出一個BeanInitializationException異常。

20  請舉例說明@Qualifier註解?

@Qualifier註解意味着能夠在被標註Bean的字段上自動裝配。Qualifier註解能夠用來取消Spring不能取消的Bean應用。 

21  構造方法注入和設值注入有什麼區別?

請注意如下明顯的區別:

(1)設值注入方法支持大部分的依賴注入,若是咱們僅須要注入int、string和long型的變量,不要用設值的方法注入。對於基本類型,若是咱們沒有注入,能夠爲基本類型設置默認值。構造方法注入不支持大部分依賴注入,由於在調用構造方法時必須傳入正確的構造參數,不然會報錯。

(2)設值注入不會重寫構造方法的值。若是咱們對同一個變量同時使用了構造方法注入和設值方法注入,那麼構造方法將不能覆蓋由設值方法注入的值。很明顯,由於構造方法只在對象被建立時調用。

(3)在使用設值注入時有可能還不能保證某種依賴是否已經被注入,也就是說,這時對象的依賴關係有多是不完整的。而在另外一種狀況下,構造器注入則不容許生成依賴關係不完整的對象。

(4)在設值注入時若是對象A和對象B互相依賴,在建立對象A時Spring會拋出sObjectCurrentlyInCreationException異常,由於在對象B被建立以前對象A是不能被建立的,反之亦然。Spring用設值注入的方法解決了循環依賴的問題,由於對象的設值方法是在對象被建立以前被調用的。

22  Spring框架中有哪些不一樣類型的事件?

Spring的ApplicationContext 提供了支持事件和代碼中監聽器的功能。

咱們能夠建立Bean來監聽在ApplicationContext 中發佈的事件。ApplicationEvent類和在ApplicationContext接口中處理的事件,若是一個Bean實現了ApplicationListener接口,當一個ApplicationEvent 被髮布之後,Bean會自動被通知。

public class AllApplicationEventListener implements ApplicationListener<ApplicationEvent> {

   @Override

   public void onApplicationEvent(ApplicationEvent applicationEvent) {

      //process event

   }

}

 

Spring 提供瞭如下5種標準的事件:

(1)上下文更新事件(ContextRefreshedEvent):該事件會在ApplicationContext被初始化或者更新時發佈。也能夠在調用ConfigurableApplicationContext 接口中的refresh()方法時被觸發。 

(2)上下文開始事件(ContextStartedEvent):當容器調用ConfigurableApplicationContext的Start()方法開始/從新開始容器時觸發該事件。

(3)上下文中止事件(ContextStoppedEvent):當容器調用ConfigurableApplicationContext的Stop()方法中止容器時觸發該事件。

(4)上下文關閉事件(ContextClosedEvent):當ApplicationContext被關閉時觸發該事件。容器被關閉時,其管理的全部單例Bean都被銷燬。

(5)請求處理事件(RequestHandledEvent):在Web應用中,當一個HTTP請求(Request)結束時觸發該事件。

除了上面介紹的事件,還能夠經過擴展ApplicationEvent 類來開發自定義的事件。

public class CustomApplicationEvent extends ApplicationEvent {

   public CustomApplicationEvent ( Object source, final String msg ){

      super(source);

      System.out.println("Created a Custom event");

   }

}

爲了監聽這個事件,還須要建立一個監聽器:

public class CustomEventListener implements ApplicationListener < CustomApplicationEvent >{

   @Override

   public void onApplicationEvent(CustomApplicationEvent applicationEvent) {

   }

}

 

以後經過applicationContext接口的publishEvent()方法來發布自定義事件:

CustomApplicationEvent customEvent = new CustomApplicationEvent(applicationContext, 「Test message」);

applicationContext.publishEvent(customEvent);

23  FileSystemResource和ClassPathResource有何區別?

在FileSystemResource 中須要給出spring-config.xml文件在項目中的相對路徑或者絕對路徑。在ClassPathResource中Spring會在ClassPath中自動搜尋配置文件,因此要把ClassPathResource 文件放在ClassPath下。

若是將spring-config.xml保存在了src文件夾下,只需給出配置文件的名稱便可,由於src文件夾是默認的。

簡而言之,ClassPathResource在環境變量中讀取配置文件,FileSystemResource在配置文件中讀取配置文件。

24  Spring 框架中都用到了哪些設計模式?

Spring框架中使用了大量的設計模式,下面列舉了比較有表明性的: 

(1)代理模式:在AOP和remoting中被用得比較多。 

(2)單例模式:在Spring配置文件中定義的Bean默認爲單例模式。 

(3)模板模式:用來解決代碼重複的問題。好比RestTemplate、JmsTemplate、JpaTemplate。

(4)委派模式:Srping提供了DispatcherServlet來對請求進行分發。 

(5)工廠模式:BeanFactory用來建立對象的實例,貫穿於BeanFactory / ApplicationContext接口的核心理念。

(6)代理模式:AOP思想的底層實現技術,Spring中採用JDK Proxy和CgLib類庫。

25  在Spring框架中如何更有效地使用JDBC?

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

26  請解釋下Spring框架中的IOC容器?

Spring中的org.springframework.beans包和org.springframework.context包構成了Spring框架IOC容器的基礎。

BeanFactory接口提供了一個先進的配置機制,使得任何類型的對象的配置都成爲可能。ApplicationContex接口對BeanFactory(是一個子接口)進行了擴展,在BeanFactory的基礎上添加了其餘功能,好比與Spring的AOP更容易集成,也提供了處理Message Resource的機制(用於國際化)、事件傳播及應用層的特別配置,好比針對Web應用的WebApplicationContext。

27  在Spring中能夠注入null或空字符串嗎?

徹底能夠。

 

若是想深刻了解Spring,能夠關注我最近出的新書《Spring5核心原理與30個類手寫實戰》。

去各大網店搜索「手寫Spring」能夠購買。咕泡粉絲能夠掃碼經過粉絲綠色通道購買享優惠:

相關文章
相關標籤/搜索