Spring核心面試必備知識點彙總整理

IOC和DI的含義

Inversion of control 控制反轉 不是一種技術,而是一種設計理念。意味着將設計好的對象交給容器起來進行管理和控制,而不是傳統的在對象內部進行直接的控制。原來是應用程序本身是老大,需要什麼資源都是主動出擊,比如new xxx 的方式來獲取,有了IOC之後就變成被動的了,被動等待容器來創建並注入其需要的資源對象。

Dependency Injection 依賴注入 組件之間的依賴關係由程序運行時動態決定,由容器動態地將某個依賴關係注入到組件之中,比如某類需要操作數據庫的connection對象 有了依賴注入,只需要告訴spring需要connection對象,在程序運行的過程中會在合適的時機動態地將這個connection對象注入到該類中,這就是依賴注入。

 

BeanFactory和ApplicationContext的區別

相同點:

  1. 都是接口 BeanFactory是最底層的接口 ApplicationContext是由BeanFactory派生而來,具備了BeanFactory的所有的功能

區別:

  1. ApplicationContext以一種更向面向框架的方式工作以及對上下文進行分層和實現繼承,提供的更加豐富的功能:
  • MessageSource 國際化的資源訪問
  • 資源訪問 比如URL和文件
  • 事件傳播
  • 載入多個(有繼承關係)上下文 ,使得每一個上下文都專注於一個特定的層次,比如應用的web層  
  1. BeanFactory 採用的是延遲加載,第一次getBean的時候纔會初始化Bean
  2. 而ApplicationContext則相反,它是在容器啓動時,一次性創建了所有的Bean。這樣,在容器啓動時,我們就可以發現Spring中存在的配置錯誤

 

ApplicationContext的常見實現方式

  • ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
  • ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath*:beans.xml");
  • ServletContext servletContext = request.getSession().getServletContext();      

ApplicationContext ctx  = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);

  • ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);

 

Spring的三種配置方式

  1. 基於xml的配置

使用被spring命名空間所支持的一系列的標籤所支持 包括contexts beans jdbc tx aop mvc等

  1. 基於Java的配置

由@Configuration和@Bean註解配合實現 @Bean註解會去實例化、配置和初始化一個對象,將這個對象交給IOC容器來進行管理

@Configuration表示這個類作爲bean定義的配置資源

  1. 基於註解的配置

可以用註解的方式來替代XML方式的bean描述,可以將bean描述轉移到組件類的內部,只需要在相關類上、方法上或者字段聲明上使用註解即可。註解注入將會被容器在XML注入之前被處理,所以後者會覆蓋掉前者對於同一個屬性的處理結果。

註解裝配在Spring中是默認關閉的。所以需要在Spring文件中配置一下才能使用基於註解的裝配模式。

<context:annotation-config/>

 

Spring Bean的生命週期

  1. 實例化一個bean
  2. 按照spring上下文對實例化的bean進行配置
  3. 如果這個bean實現了BeanNameAware接口 調用setBeanName方法來設置beanName
  4. 如果這個Bean已經實現了BeanFactoryAware接口,會調用它實現的setBeanFactory(setBeanFactory(BeanFactory)傳遞的是Spring工廠自身(可以用這個方式來獲取其它Bean,只需在Spring配置文件中配置一個普通的Bean就可以)
  5. 如果這個Bean已經實現了ApplicationContextAware接口,會調用setApplicationContext(ApplicationContext)方法,傳入Spring上下文
  6. 如果這個Bean關聯了BeanPostProcessor接口,將會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor經常被用作是Bean內容的更改,並且由於這個是在Bean初始化結束時調用那個的方法,也可以被應用於內存或緩存技術
  7. 如果關聯了InitializingBean接口 則調用afterPropertiesSet() 方法(ps:調用了BeanPostProcessor.postProcessBeforeInitialization方法之後調用該方法)
  8. 如果Bean在Spring配置文件中配置了init-method屬性會自動調用其配置的初始化方法
  9. 如果這個Bean關聯了BeanPostProcessor接口,將會調用postProcessAfterInitialization(Object obj, String s)方法
  10. 當Bean不再需要時,會經過清理階段,如果Bean實現了DisposableBean這個接口,會調用那個其實現的destroy()方法
  11. 最後,如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用其配置的銷燬方法

 

Spring Bean的作用域

  • Singleton:在spring的容器中只存在一個bean實例 bean以單例的形式存在
  • Prototype:每次從容器中調用bean時 都會返回一個新的實例 即相當於做new xxxBean的實例化動作
  • Request:每次的Http請求都會去創建一個bean 僅僅用於webApplicationContext環境
  • Session:同一個http session共享一個bean 不同的http session使用不同的bean,僅僅用於webApplicationContext環境
  • GlobalSession;同一個全局session共享bean ,用於porlet僅僅用於WebApplicationContext環境

 

Spring的五種自動裝配模式

  • byName模式:在使用byName模式進行自動裝配時,Spring會嘗試用每個屬性去上下文中適配同名的bean,例如有一個TestInject bean,該bean中有一個私有屬性 OmsGoodsVo 並且 我們在ApplicationContext中也定義了名爲 OmsGoodsVo這個bean,那麼在TestInject初始化時OmsGoodsVo這個bean將會被自動分配給TestInject中的OmsGoodsVo屬性。
  • byType模式:在使用byType模式進行自動裝配時,Spring會嘗試在Spring上下文中取尋找相同類型的bean去分配給目標bean的對應屬性。
  • 構造函數模式:該模式和byType模式有異曲同工之妙,該模式通過bean的構造器進行注入而不是通過setter ,在該模式下Spring總是會嘗試進行構造器最大入參的適配,例如TestInjectbean有兩個構造器分別是TestInject1(String,Integer) 和TestInject2(String) 如果在ApplicationContext上下文中同時存在一個String bean和 Integer bean,那麼Spring總是會去使用TestInject1去進行注入。
  • 默認模式:Spring 將自動在構造函數模式和byType模式之間進行選擇,選擇的依據是如果bean存在一個默認的無參數構造函數則使用byType模式進行構造,否則用構造函數模式。
  • 無:不使用任何模式,這是Spring的默認設置

 

@Autowired @Qualifier等註解的區別

  1. AutoWired 自動注入的工作原理 先按照類型去容器中找對應的bean applicationContext.getBean(BookService.class); 如果按照類型找到多個 再將屬性的名稱作爲組件的ID去容器中查詢 applicationContext.getBean(bookDao);

AutoWired可以設置required true/false

  1. @Qualifier("personDao") 這個註解和@Autowired一起使用表示按名稱進行查找
  2. @Primary 讓spring在首選指定也可以繼續使用@Qualifier進行明確指定需要裝配的bean
  3. @Required註解用於setter方法,表明這個屬性是必要的,不可少的,必須注入值
  4. @Resource(JSR250-Java規範的註解)可以和@AutoWire一樣實現自動裝配的功能 默認是按照組件名稱進行裝配的 @Resource(name="bookDao2")
  5. @Inject (JSR330-Java規範的註解)需要導入javax.inject的包 但是沒有required=false的功能自動裝配:

 

FileSystemSource和ClassPathSource的區別

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

如果將spring-config.xml保存在了src文件夾下的話,只需給出配置文件的名稱即可,因爲src文件夾是默認。

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

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