java面試題之Spring篇


1,什么是Spring?Spring優點是什么?

  Spring是一個分層的JavaSE/EE full-stack(一站式)輕量級開源框架

  一站式:有EE開發的每一層解決方案

    WEB層:SpringMVC

    Service層:Spring的Bean管理,Spring聲明式事務

    DAO層:Spring的JDBC模板,Spring的ORM模板

 

  優點:

  非侵入式設計:Spring是一種非侵入式(non-invasive)框架,它可以使應用程序代碼對框架的依賴最小化。

  方便解耦、簡化開發:Spring就是一個大工廠,可以將所有對象的創建和依賴關系的維護工作都交給Spring容器的管理,大大的降低了組件之間的耦合性。

  支持AOP:Spring提供了對AOP的支持,它允許將一些通用任務,如安全、事物、日志等進行集中式處理,從而提高了程序的復用性。

  支持聲明式事務處理:只需要通過配置就可以完成對事物的管理,而無須手動編程。

  支持多數主流框架的集成:如hibernate、mybatis、struts等

 

2,什么是IOC?談談對IOC的理解

  IOC(Inversion of Control)控制反轉,將對象的創建權反轉(交給)Spring,Spring會根據配置文件去創建實例和管理各個實例之間的依賴關系,對象與對象之間松散

  耦合,也利於功能的復用。說白了就是,IOC讓對象的創建不用去new了,可以由spring自動生產,使用java的反射機制,根據配置文件在運行時動態的去創建對象以及

  管理對象,並調用對象的方法。

 

  IOC還有一種叫法:DI(Dependency Injection)依賴注入,這兩個名詞其實是同一個意思,要深入理解的話就是:IOC是一種設計模式,是一種思想,相當於一個容器,而

  DI就好比是實現IOC的一種方式。

 

3,什么是AOP?談談對AOP的理解

  AOP(Aspect Oriented Programming)面向切面編程,是OOP(面向對象編程)的延伸。

 

  用於將那些與業務無關,但卻對多個對象產生影響的公共行為和邏輯,抽取並封裝為一個可重用的模塊,這個模塊被命名為“切面”(Aspect),減少系統中的重復代碼,降低了模塊間的耦合度,同時提高了系統的可維護性。可用於權限認證、日志、事務處理。

  Spring中的AOP代理離不開Spring的IOC容器,代理的生成,管理及其依賴關系都是由IOC容器負責。AOP實現的關鍵在於代理模式,AOP代理主要分為靜態代理和動態代理。靜態代理的代表為AspectJ;動態代理則以Spring AOP為代表。AspectJ是靜態代理的增強,也被稱為編譯時增強;Spring AOP 又被稱為運行時增強。靜態代理與動態代理區別在於生成AOP代理對象的時機不同,相對來說AspectJ的靜態代理方式具有更好的性能,但是AspectJ需要特定的編譯器進行處理,而Spring AOP則無需特定的編譯器處理。

  Spring AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理:JDK動態代理只提供接口的代理,不支持類的代理。核心InvocationHandler接口和Proxy類,InvocationHandler 通過invoke()方法反射來調用目標類中的代碼,動態地將橫切邏輯和業務編織在一起;接着,Proxy利用 InvocationHandler動態創建一個符合某一接口的的實例,  生成目標類的代理對象。

 

 

 

4,什么是Spring Bean?SpringBean的生命周期?SpringBean的作用域?

  Spring Bean就是被Spring IOC容器初始化,裝配和管理的Java對象。

 

  Bean的生命周期:

    總體上來看可分為四個階段:實例化 -> 屬性賦值 -> 初始化 -> 銷毀

 

    我們一個一個階段來看:

      (1)實例化之前,Bean會調用InstantiationAwareBeanPostProcessor接口(BeanPostProcessor接口的子接口,下面初始化階段會提到

        中的postProcessBeforeInstantiation()方法

 

      (2)實例化階段:調用createBeanInstance()方法;

 

      (3)實例化之后,調用InstantiationAwareBeanPostProcessor接口中的postProcessAfterInstantiation()方法

 

      (4)屬性賦值階段:調用populateBean()方法;

 

      (5)初始化之前:調用Aware類型的接口(例如:BeanNameAware、BeanFactoryAware)中的方法,這些接口的作用就是去拿到Spring

        容器的資源;除此之外,還會調用BeanPostProcessor接口中的postProcessBeforeInitialization()方法。

 

 

      (6)初始化階段:調用initializeBean()方法;如果Bean在Spring配置文件中配置了 init-method 屬性,則會自動調用其配置的初始化方法。

 

      (7)初始化之后:會調用BeanPostProcessor接口中的postProcessAfterInitialization()方法

 

      (8)銷毀階段:調用DisposableBean接口中的destroy()方法;如果這個Bean的Spring配置中配置了destroy-method屬性,會自動調用

        其配置的銷毀方法。

 

      作用域(5個):

      singleton默認的,單例模式,只會創建一個實例對象,多個變量只會指向這唯一一個對象

      prototype:多例模式,每調用一次getBean方法就會創建一個實例對象

      request:應用於web項目,Spring創建這個類以后,將這個類存入到request范圍中

      session:應用於web項目,Spring創建這個類以后,將這個類存入到session范圍中

      globalsession:應用於web項目,必須在porlet環境下使用,如果沒有這種環境,相對於session

 

 

5,Spring的自動裝配有哪些?

  參考:https://www.jianshu.com/p/2f1c9fad1d2d

 

 

 

6,BeanFactory和ApplicationContext有什么區別?

  BeanFactory和ApplicationContext是Spring的兩大核心接口,都可以當做Spring的容器。其中ApplicationContext是BeanFactory的子接口。

 

  BeanFactory是Spring中最底層的接口,ApplicationContext接口作為BeanFactory的派生,除了提供BeanFactory所具有的功能外,還提供了更完整的框架功能:

 

    ①繼承MessageSource,因此支持國際化。

 

    ②統一的資源文件訪問方式。

 

    ③提供在監聽器中注冊bean的事件。

 

    ④同時加載多個配置文件。

 

    ⑤載入多個(有繼承關系)上下文 ,使得每一個上下文都專注於一個特定的層次,比如應用的web層。

 

  BeanFactory只有在使用到某個Bean的時候才會去調用getBean()方法來生成類的實例,如果Bean的某一個屬性沒有注入,BeanFacotry加載后,直至第一次使用調用getBean方法才會拋出異常;ApplicationContext在容器啟動時,一次性創建了所有的Bean,這樣我們就可以發現Spring中存在的配置錯誤,這樣有利於檢查所依賴屬性是否注入。但這樣的話,當配置的bean較多時,ApplicationContext 比較占內存且程序啟動慢。

  參考自:https://blog.csdn.net/a745233700/java/article/details/80959716

 

 

7,Spring基於xml注入依賴的方式有哪些?

  set()方法注入、構造器注入、靜態工廠注入、實例工廠注入

 

8,Spring事務管理的方式有哪些?

  編程式事務管理(了解)

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

 

9,Spring的通知類型有哪些?

  Before:前置通知

  

  

 

 

  

 

  AfterReturning:返回后通知,加上returning屬性可以接收返回值

 

  

 

 

   

  

 

 

  Around:環繞通知

  

 

 

   

 

 

  

  AfterThrowing:異常拋出通知,throwing屬性可以捕捉異常

  

 

 

   

 

   

 

   

   

  After:最終通知

  

 

 

   

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM