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:最終通知