主頁 >  其他 > ‘金9銀10‘:2020最新Spring面試題詳解(下)

‘金9銀10‘:2020最新Spring面試題詳解(下)

2020-09-12 20:14:52 其他

前言

目前 Java 架構中使用最多的就是 Spring 家族的工具,家族共有十幾個成員,其中包括我們耳熟能詳的 Spring、Spring MVC、Spring Boot、Spring Cloud 等等,他們之間到底有什么關系,如何才能正確使用呢?相信很多剛剛入門的程式員朋友并不是很了解,這篇文章會由淺入深介紹 Spring 家族,此為文章為下半篇,上半篇有需求學習的朋友可以進入我主頁點擊進入觀看!
筆者已經將這次面試題答案整理成學習筆記,還有各種java核心資料
以下是小部分資料截圖(所有資料均已整合成檔案,pdf壓縮打包處理),
有需求的朋友們可以點擊這里來獲取, 暗號:qf
在這里插入圖片描述

正文

ApplicationContext通常的實作是什么?

FileSystemXmlApplicationContext :此容器從一個XML檔案中加載beans的定義,XML Bean 組態檔的全路徑名必須提供給它的建構式,

ClassPathXmlApplicationContext:此容器也從一個XML檔案中加載beans的定義,這里,你需要正確設定classpath因為這個容器將在classpath里找bean配置,

WebXmlApplicationContext:此容器加載一個XML檔案,此檔案定義了一個WEB應用的所有bean,

什么是Spring的依賴注入?

控制反轉IoC是一個很大的概念,可以用不同的方式來實作,其主要實作方式有兩種:依賴注入和依賴查找

依賴注入:相對于IoC而言,依賴注入(DI)更加準確地描述了IoC的設計理念,所謂依賴注入(Dependency Injection),即組件之間的依賴關系由容器在應用系統運行期來決定,也就是由容器動態地將某種依賴關系的目標物件實體注入到應用系統中的各個關聯的組件之中,組件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關系,

依賴注入的基本原則

依賴注入的基本原則是:應用組件不應該負責查找資源或者其他依賴的協作物件,配置物件的作業應該由IoC容器負責,“查找資源”的邏輯應該從應用組件的代碼中抽取出來,交給IoC容器負責,容器全權負責組件的裝配,它會把符合依賴關系的物件通過屬性(JavaBean中的setter)或者是構造器傳遞給需要的物件,

依賴注入有什么優勢

依賴注入之所以更流行是因為它是一種更可取的方式:讓容器全權負責依賴查詢,受管組件只需要暴露JavaBean的setter方法或者帶引數的構造器或者介面,使容器可以在初始化時組裝物件的依賴關系,其與依賴查找方式相比,主要優勢為:

查找定位操作與應用代碼完全無關,
不依賴于容器的API,可以很容易地在任何容器以外使用應用物件,
不需要特殊的介面,絕大多數物件可以做到完全不必依賴容器,
有哪些不同型別的依賴注入實作方式?

依賴注入是時下最流行的IoC實作方式,依賴注入分為介面注入(Interface Injection),Setter方法注入(Setter Injection)和構造器注入(Constructor Injection)三種方式,其中介面注入由于在靈活性和易用性比較差,現在從Spring4開始已被廢棄,

構造器依賴注入:構造器依賴注入通過容器觸發一個類的構造器來實作的,該類有一系列引數,每個引數代表一個對其他類的依賴,

Setter方法注入:Setter方法注入是容器通過呼叫無參構造器或無參static工廠 方法實體化bean之后,呼叫該bean的setter方法,即實作了基于setter的依賴注入,

構造器依賴注入和 Setter方法注入的區別
在這里插入圖片描述
兩種依賴方式都可以使用,構造器注入和Setter方法注入,最好的解決方案是用構造器引數實作強制依賴,setter方法實作可選依賴,

Spring Beans(19)

什么是Spring beans?

Spring beans 是那些形成Spring應用的主干的java物件,它們被Spring IOC容器初始化,裝配,和管理,這些beans通過容器中配置的元資料創建,比如,以XML檔案中 的形式定義,

一個 Spring Bean 定義 包含什么?

一個Spring Bean 的定義包含容器必知的所有配置元資料,包括如何創建一個bean,它的生命周期詳情及它的依賴,

如何給Spring 容器提供配置元資料?Spring有幾種配置方式

這里有三種重要的方法給Spring 容器提供配置元資料,

XML組態檔,
基于注解的配置,
基于java的配置,
Spring組態檔包含了哪些資訊

Spring組態檔是個XML 檔案,這個檔案包含了類資訊,描述了如何配置它們,以及如何相互呼叫,

Spring基于xml注入bean的幾種方式

Set方法注入;
構造器注入:①通過index設定引數的位置;②通過type設定引數型別;
靜態工廠注入;
實體工廠;
你怎樣定義類的作用域?

當定義一個 在Spring里,我們還能給這個bean宣告一個作用域,它可以通過bean 定義中的scope屬性來定義,如,當Spring要在需要的時候每次生產一個新的bean實體,bean的scope屬性被指定為prototype,另一方面,一個bean每次使用的時候必須回傳同一個實體,這個bean的scope 屬性 必須設為 singleton,

解釋Spring支持的幾種bean的作用域

Spring框架支持以下五種bean的作用域:

singleton : bean在每個Spring ioc 容器中只有一個實體,
prototype:一個bean的定義可以有多個實體,
request:每次http請求都會創建一個bean,該作用域僅在基于web的Spring ApplicationContext情形下有效,
session:在一個HTTP Session中,一個bean定義對應一個實體,該作用域僅在基于web的Spring ApplicationContext情形下有效,
global-session:在一個全域的HTTP Session中,一個bean定義對應一個實體,該作用域僅在基于web的Spring ApplicationContext情形下有效,

注意: 預設的Spring bean 的作用域是Singleton,使用 prototype 作用域需要慎重的思考,因為頻繁創建和銷毀 bean 會帶來很大的性能開銷,

Spring框架中的單例bean是執行緒安全的嗎?

不是,Spring框架中的單例bean不是執行緒安全的,

spring 中的 bean 默認是單例模式,spring 框架并沒有對單例 bean 進行多執行緒的封裝處理,

實際上大部分時候 spring bean 無狀態的(比如 dao 類),所有某種程度上來說 bean 也是安全的,但如果 bean 有狀態的話(比如 view model 物件),那就要開發者自己去保證執行緒安全了,最簡單的就是改變 bean 的作用域,把“singleton”變更為“prototype”,這樣請求 bean 相當于 new Bean()了,所以就可以保證執行緒安全了,

有狀態就是有資料存盤功能,
無狀態就是不會保存資料,
Spring如何處理執行緒并發問題?

在一般情況下,只有無狀態的Bean才可以在多執行緒環境下共享,在Spring中,絕大部分Bean都可以宣告為singleton作用域,因為Spring對一些Bean中非執行緒安全狀態采用ThreadLocal進行處理,解決執行緒安全問題,

ThreadLocal和執行緒同步機制都是為了解決多執行緒中相同變數的訪問沖突問題,同步機制采用了“時間換空間”的方式,僅提供一份變數,不同的執行緒在訪問前需要獲取鎖,沒獲得鎖的執行緒則需要排隊,而ThreadLocal采用了“空間換時間”的方式,

ThreadLocal會為每一個執行緒提供一個獨立的變數副本,從而隔離了多個執行緒對資料的訪問沖突,因為每一個執行緒都擁有自己的變數副本,從而也就沒有必要對該變數進行同步了,ThreadLocal提供了執行緒安全的共享物件,在撰寫多執行緒代碼時,可以把不安全的變數封裝進ThreadLocal,

解釋Spring框架中bean的生命周期

在傳統的Java應用中,bean的生命周期很簡單,使用Java關鍵字new進行bean實體化,然后該bean就可以使用了,一旦該bean不再被使用,則由Java自動進行垃圾回收,相比之下,Spring容器中的bean的生命周期就顯得相對復雜多了,正確理解Spring bean的生命周期非常重要,因為你或許要利用Spring提供的擴展點來自定義bean的創建程序,下圖展示了bean裝載到Spring應用背景關系中的一個典型的生命周期程序,
在這里插入圖片描述
bean在Spring容器中從創建到銷毀經歷了若干階段,每一階段都可以針對Spring如何管理bean進行個性化定制,

正如你所見,在bean準備就緒之前,bean工廠執行了若干啟動步驟,

我們對上圖進行詳細描述:

Spring對bean進行實體化;

Spring將值和bean的參考注入到bean對應的屬性中;

如果bean實作了BeanNameAware介面,Spring將bean的ID傳遞給setBean-Name()方法;

如果bean實作了BeanFactoryAware介面,Spring將呼叫setBeanFactory()方法,將BeanFactory容器實體傳入;

如果bean實作了ApplicationContextAware介面,Spring將呼叫setApplicationContext()方法,將bean所在的應用背景關系的參考傳入進來;

如果bean實作了BeanPostProcessor介面,Spring將呼叫它們的post-ProcessBeforeInitialization()方法;

如果bean實作了InitializingBean介面,Spring將呼叫它們的after-PropertiesSet()方法,類似地,如果bean使用initmethod宣告了初始化方法,該方法也會被呼叫;

如果bean實作了BeanPostProcessor介面,Spring將呼叫它們的post-ProcessAfterInitialization()方法;

此時,bean已經準備就緒,可以被應用程式使用了,它們將一直駐留在應用背景關系中,直到該應用背景關系被銷毀;

如果bean實作了DisposableBean介面,Spring將呼叫它的destroy()介面方法,同樣,如果bean使用destroy-method宣告了銷毀方法,該方法也會被呼叫,

現在你已經了解了如何創建和加載一個Spring容器,但是一個空的容器并沒有太大的價值,在你把東西放進去之前,它里面什么都沒有,為了從Spring的DI(依賴注入)中受益,我們必須將應用物件裝配進Spring容器中,

哪些是重要的bean生命周期方法? 你能多載它們嗎?

有兩個重要的bean 生命周期方法,第一個是setup , 它是在容器加載bean的時候被呼叫,第二個方法是 teardown 它是在容器卸載類的時候被呼叫,

bean 標簽有兩個重要的屬性(init-method和destroy-method),用它們你可以自己定制初始化和注銷方法,它們也有相應的注解(@PostConstruct和@PreDestroy),

什么是Spring的內部bean?什么是Spring inner beans?

在Spring框架中,當一個bean僅被用作另一個bean的屬性時,它能被宣告為一個內部bean,內部bean可以用setter注入“屬性”和構造方法注入“構造引數”的方式來實作,內部bean通常是匿名的,它們的Scope一般是prototype,

在 Spring中如何注入一個java集合?

Spring提供以下幾種集合的配置元素:

型別用于注入一列值,允許有相同的值,

型別用于注入一組值,不允許有相同的值,

型別用于注入一組鍵值對,鍵和值都可以為任意型別,

型別用于注入一組鍵值對,鍵和值都只能為String型別,

什么是bean裝配?

裝配,或bean 裝配是指在Spring 容器中把bean組裝到一起,前提是容器需要知道bean的依賴關系,如何通過依賴注入來把它們裝配到一起,

什么是bean的自動裝配?

在Spring框架中,在組態檔中設定bean的依賴關系是一個很好的機制,Spring 容器能夠自動裝配相互合作的bean,這意味著容器不需要和配置,能通過Bean工廠自動處理bean之間的協作,這意味著 Spring可以通過向Bean Factory中注入的方式自動搞定bean之間的依賴關系,自動裝配可以設定在每個bean上,也可以設定在特定的bean上,

解釋不同方式的自動裝配,spring 自動裝配 bean 有哪些方式?

在spring中,物件無需自己查找或創建與其關聯的其他物件,由容器負責把需要相互協作的物件參考賦予各個物件,使用autowire來配置自動裝載模式,

在Spring框架xml配置中共有5種自動裝配:

no:默認的方式是不進行自動裝配的,通過手工設定ref屬性來進行裝配bean,
byName:通過bean的名稱進行自動裝配,如果一個bean的 property 與另一bean 的name 相同,就進行自動裝配,
byType:通過引數的資料型別進行自動裝配,
constructor:利用建構式進行裝配,并且建構式的引數通過byType進行裝配,
autodetect:自動探測,如果有構造方法,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配,
使用@Autowired注解自動裝配的程序是怎樣的?

使用@Autowired注解來自動裝配指定的bean,在使用@Autowired注解之前需要在Spring組態檔進行配置,<context:annotation-config />,

在啟動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor后置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查找需要的bean,并裝配給該物件的屬性,在使用@Autowired時,首先在容器中查詢對應型別的bean:

如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的資料;
如果查詢的結果不止一個,那么@Autowired會根據名稱來查找;
如果上述查找的結果為空,那么會拋出例外,解決方法時,使用required=false,
自動裝配有哪些局限性?

自動裝配的局限性是:

重寫:你仍需用 和 配置來定義依賴,意味著總要重寫自動裝配,

基本資料型別:你不能自動裝配簡單的屬性,如基本資料型別,String字串,和類,

模糊特性:自動裝配不如顯式裝配精確,如果有可能,建議使用顯式裝配,

你可以在Spring中注入一個null 和一個空字串嗎?

可以,

Spring注解(8)

什么是基于Java的Spring注解配置? 給一些注解的例子

基于Java的配置,允許你在少量的Java注解的幫助下,進行你的大部分Spring配置而非通過XML檔案,

以@Configuration 注解為例,它用來標記類可以當做一個bean的定義,被Spring IOC容器使用,

另一個例子是@Bean注解,它表示此方法將要回傳一個物件,作為一個bean注冊進Spring應用背景關系,

@Configuration
public class StudentConfig {
    @Bean
    public StudentBean myStudent() {
        return new StudentBean();
    }
}

怎樣開啟注解裝配?

注解裝配在默認情況下是不開啟的,為了使用注解裝配,我們必須在Spring組態檔中配置 context:annotation-config/元素,

@Component, @Controller, @Repository, @Service 有何區別?

@Component:這將 java 類標記為 bean,它是任何 Spring 管理組件的通用構造型,spring 的組件掃描機制現在可以將其拾取并將其拉入應用程式環境中,

@Controller:這將一個類標記為 Spring Web MVC 控制器,標有它的 Bean 會自動匯入到 IoC 容器中,

@Service:此注解是組件注解的特化,它不會對 @Component 注解提供任何其他行為,您可以在服務層類中使用 @Service 而不是 @Component,因為它以更好的方式指定了意圖,

@Repository:這個注解是具有類似用途和功能的 @Component 注解的特化,它為 DAO 提供了額外的好處,它將 DAO 匯入 IoC 容器,并使未經檢查的例外有資格轉換為 Spring DataAccessException,

@Required 注解有什么作用

這個注解表明bean的屬性必須在配置的時候設定,通過一個bean定義的顯式的屬性值或通過自動裝配,若@Required注解的bean屬性未被設定,容器將拋出BeanInitializationException,示例:

public class Employee {
private String name;
@Required
public void setName(String name){
this.name=name;
}
public string getName(){
return name;
}
}
@Autowired 注解有什么作用

@Autowired默認是按照型別裝配注入的,默認情況下它要求依賴物件必須存在(可以設定它required屬性為false),@Autowired 注解提供了更細粒度的控制,包括在何處以及如何完成自動裝配,它的用法和@Required一樣,修飾setter方法、構造器、屬性或者具有任意名稱和/或多個引數的PN方法,

public class Employee {
private String name;
@Autowired
public void setName(String name) {
this.name=name;
}
public string getName(){
return name;
}
}
@Autowired和@Resource之間的區別

@Autowired可用于:建構式、成員變數、Setter方法

@Autowired和@Resource之間的區別

@Autowired默認是按照型別裝配注入的,默認情況下它要求依賴物件必須存在(可以設定它required屬性為false),
@Resource默認是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean才會按照型別來裝配注入,
@Qualifier 注解有什么作用

當您創建多個相同型別的 bean 并希望僅使用屬性裝配其中一個 bean 時,您可以使用@Qualifier 注解和 @Autowired 通過指定應該裝配哪個確切的 bean 來消除歧義,

@RequestMapping 注解有什么用?

@RequestMapping 注解用于將特定 HTTP 請求方法映射到將處理相應請求的控制器中的特定類/方法,此注釋可應用于兩個級別:

類級別:映射請求的 URL
方法級別:映射 URL 以及 HTTP 請求方法
Spring資料訪問(14)

解釋物件/關系映射集成模塊

Spring 通過提供ORM模塊,支持我們在直接JDBC之上使用一個物件/關系映射映射(ORM)工具,Spring 支持集成主流的ORM框架,如Hiberate,JDO和 iBATIS,JPA,TopLink,JDO,OJB ,Spring的事務管理同樣支持以上所有ORM框架及JDBC,

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

使用Spring JDBC 框架,資源管理和錯誤處理的代價都會被減輕,所以開發者只需寫statements 和 queries從資料存取資料,JDBC也可以在Spring框架提供的模板類的幫助下更有效地被使用,這個模板叫JdbcTemplate

解釋JDBC抽象和DAO模塊

通過使用JDBC抽象和DAO模塊,保證資料庫代碼的簡潔,并能避免資料庫資源錯誤關閉導致的問題,它在各種不同的資料庫的錯誤資訊之上,提供了一個統一的例外訪問層,它還利用Spring的AOP 模塊給Spring應用中的物件提供事務管理服務,

spring DAO 有什么用?

Spring DAO(資料訪問物件) 使得 JDBC,Hibernate 或 JDO 這樣的資料訪問技術更容易以一種統一的方式作業,這使得用戶容易在持久性技術之間切換,它還允許您在撰寫代碼時,無需考慮捕獲每種技術不同的例外,

spring JDBC API 中存在哪些類?

JdbcTemplate

SimpleJdbcTemplate

NamedParameterJdbcTemplate

SimpleJdbcInsert

SimpleJdbcCall

JdbcTemplate是什么

JdbcTemplate 類提供了很多便利的方法解決諸如把資料庫資料轉變成基本資料型別或物件,執行寫好的或可呼叫的資料庫操作陳述句,提供自定義的資料錯誤處理,

使用Spring通過什么方式訪問Hibernate?使用 Spring 訪問 Hibernate 的方法有哪些?

在Spring中有兩種方式訪問Hibernate:

使用 Hibernate 模板和回呼進行控制反轉

擴展 HibernateDAOSupport 并應用 AOP 攔截器節點

如何通過HibernateDaoSupport將Spring和Hibernate結合起來?

用Spring的 SessionFactory 呼叫 LocalSessionFactory,集成程序分三步:

配置the Hibernate SessionFactory
繼承HibernateDaoSupport實作一個DAO
在AOP支持的事務中裝配
Spring支持的事務管理型別, spring 事務實作方式有哪些?

Spring支持兩種型別的事務管理:

編程式事務管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護,

宣告式事務管理:這意味著你可以將業務代碼和事務管理分離,你只需用注解和XML配置來管理事務,

Spring事務的實作方式和實作原理

Spring事務的本質其實就是資料庫對事務的支持,沒有資料庫的事務支持,spring是無法提供事務功能的,真正的資料庫層的事務提交和回滾是通過binlog或者redo log實作的,

說一下Spring的事務傳播行為

spring事務的傳播行為說的是,當多個事務同時存在的時候,spring如何處理這些事務的行為,

① PROPAGATION_REQUIRED:如果當前沒有事務,就創建一個新事務,如果當前存在事務,就加入該事務,該設定是最常用的設定,

② PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行,

③ PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就拋出例外,

④ PROPAGATION_REQUIRES_NEW:創建新事務,無論當前存不存在事務,都創建新事務,

⑤ PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起,

⑥ PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出例外,

⑦ PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行,如果當前沒有事務,則按REQUIRED屬性執行,

說一下 spring 的事務隔離?

spring 有五大隔離級別,默認值為 ISOLATION_DEFAULT(使用資料庫的設定),其他四個隔離級別和資料庫的隔離級別一致:

ISOLATION_DEFAULT:用底層資料庫的設定隔離級別,資料庫設定的是什么我就用什么;

ISOLATION_READ_UNCOMMITTED:未提交讀,最低隔離級別、事務未提交前,就可被其他事務讀取(會出現幻讀、臟讀、不可重復讀);

ISOLATION_READ_COMMITTED:提交讀,一個事務提交后才能被其他事務讀取到(會造成幻讀、不可重復讀),SQL server 的默認級別;

ISOLATION_REPEATABLE_READ:可重復讀,保證多次讀取同一個資料時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的資料(會造成幻讀),MySQL 的默認級別;

ISOLATION_SERIALIZABLE:序列化,代價最高最可靠的隔離級別,該隔離級別能防止臟讀、不可重復讀、幻讀,

臟讀 :表示一個事務能夠讀取另一個事務中還未提交的資料,比如,某個事務嘗試插入記錄 A,此時該事務還未提交,然后另一個事務嘗試讀取到了記錄 A,

不可重復讀 :是指在一個事務內,多次讀同一資料,

幻讀 :指同一個事務內多次查詢回傳的結果集不一樣,比如同一個事務 A 第一次查詢時候有 n 條記錄,但是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產生了幻覺,發生幻讀的原因也是另外一個事務新增或者洗掉或者修改了第一個事務結果集里面的資料,同一個記錄的資料內容被修改了,所有資料行的記錄就變多或者變少了,

Spring框架的事務管理有哪些優點?

為不同的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的編程模式,
為編程式事務管理提供了一套簡單的API而不是一些復雜的事務API
支持宣告式事務管理,
和Spring各種資料訪問抽象層很好得集成,
你更傾向用那種事務管理型別?

大多數Spring框架的用戶選擇宣告式事務管理,因為它對應用代碼的影響最小,因此更符合一個無侵入的輕量級容器的思想,宣告式事務管理要優于編程式事務管理,雖然比編程式事務管理(這種方式允許你通過代碼控制事務)少了一點靈活性,唯一不足地方是,最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別,

Spring面向切面編程(AOP)(13)

什么是AOP

OOP(Object-Oriented Programming)面向物件編程,允許開發者定義縱向的關系,但并適用于定義橫向的關系,導致了大量代碼的重復,而不利于各個模塊的重用,

AOP(Aspect-Oriented Programming),一般稱為面向切面編程,作為面向物件的一種補充,用于將那些與業務無關,但卻對多個物件產生影響的公共行為和邏輯,抽取并封裝為一個可重用的模塊,這個模塊被命名為“切面”(Aspect),減少系統中的重復代碼,降低了模塊間的耦合度,同時提高了系統的可維護性,可用于權限認證、日志、事務處理等,

Spring AOP and AspectJ AOP 有什么區別?AOP 有哪些實作方式?

AOP實作的關鍵在于 代理模式,AOP代理主要分為靜態代理和動態代理,靜態代理的代表為AspectJ;動態代理則以Spring AOP為代表,

(1)AspectJ是靜態代理的增強,所謂靜態代理,就是AOP框架會在編譯階段生成AOP代理類,因此也稱為編譯時增強,他會在編譯階段將AspectJ(切面)織入到Java位元組碼中,運行的時候就是增強之后的AOP物件,

(2)Spring AOP使用的動態代理,所謂的動態代理就是說AOP框架不會去修改位元組碼,而是每次運行時在記憶體中臨時為方法生成一個AOP物件,這個AOP物件包含了目標物件的全部方法,并且在特定的切點做了增強處理,并回呼原物件的方法,

JDK動態代理和CGLIB動態代理的區別

Spring AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理:

JDK動態代理只提供介面的代理,不支持類的代理,核心InvocationHandler介面和Proxy類,InvocationHandler 通過invoke()方法反射來呼叫目標類中的代碼,動態地將橫切邏輯和業務編織在一起;接著,Proxy利用 InvocationHandler動態創建一個符合某一介面的的實體, 生成目標類的代理物件,
如果代理類沒有實作 InvocationHandler 介面,那么Spring AOP會選擇使用CGLIB來動態代理目標類,CGLIB(Code Generation Library),是一個代碼生成的類別庫,可以在運行時動態的生成指定類的一個子類物件,并覆寫其中特定方法并添加增強代碼,從而實作AOP,CGLIB是通過繼承的方式做的動態代理,因此如果某個類被標記為final,那么它是無法使用CGLIB做動態代理的,
靜態代理與動態代理區別在于生成AOP代理物件的時機不同,相對來說AspectJ的靜態代理方式具有更好的性能,但是AspectJ需要特定的編譯器進行處理,而Spring AOP則無需特定的編譯器處理,

InvocationHandler 的 invoke(Object proxy,Method method,Object[] args):proxy是最終生成的代理實體; method 是被代理目標實體的某個具體方法; args 是被代理目標實體某個方法的具體入參, 在方法反射呼叫時使用,

如何理解 Spring 中的代理?

將 Advice 應用于目標物件后創建的物件稱為代理,在客戶端物件的情況下,目標物件和代理物件是相同的,

Advice + Target Object = Proxy

解釋一下Spring AOP里面的幾個名詞

(1)切面(Aspect):切面是通知和切點的結合,通知和切點共同定義了切面的全部內容, 在Spring AOP中,切面可以使用通用類(基于模式的風格) 或者在普通類中以 @AspectJ 注解來實作,

(2)連接點(Join point):指方法,在Spring AOP中,一個連接點 總是 代表一個方法的執行, 應用可能有數以千計的時機應用通知,這些時機被稱為連接點,連接點是在應用執行程序中能夠插入切面的一個點,這個點可以是呼叫方法時、拋出例外時、甚至修改一個欄位時,切面代碼可以利用這些點插入到應用的正常流程之中,并添加新的行為,

(3)通知(Advice):在AOP術語中,切面的作業被稱為通知,

(4)切入點(Pointcut):切點的定義會匹配通知所要織入的一個或多個連接點,我們通常使用明確的類和方法名稱,或是利用正則運算式定義所匹配的類和方法名稱來指定這些切點,

(5)引入(Introduction):引入允許我們向現有類添加新方法或屬性,

(6)目標物件(Target Object): 被一個或者多個切面(aspect)所通知(advise)的物件,它通常是一個代理物件,也有人把它叫做 被通知(adviced) 物件, 既然Spring AOP是通過運行時代理實作的,這個物件永遠是一個 被代理(proxied) 物件,

(7)織入(Weaving):織入是把切面應用到目標物件并創建新的代理物件的程序,在目標物件的生命周期里有多少個點可以進行織入:

編譯期:切面在目標類編譯時被織入,AspectJ的織入編譯器是以這種方式織入切面的,
類加載期:切面在目標類加載到JVM時被織入,需要特殊的類加載器,它可以在目標類被引入應用之前增強該目標類的位元組碼,AspectJ5的加載時織入就支持以這種方式織入切面,
運行期:切面在應用運行的某個時刻被織入,一般情況下,在織入切面時,AOP容器會為目標物件動態地創建一個代理物件,SpringAOP就是以這種方式織入切面,
Spring在運行時通知物件

通過在代理類中包裹切面,Spring在運行期把切面織入到Spring管理的bean中,代理封裝了目標類,并攔截被通知方法的呼叫,再把呼叫轉發給真正的目標bean,當代理攔截到方法呼叫時,在呼叫目標bean方法之前,會執行切面邏輯,

直到應用需要被代理的bean時,Spring才創建代理物件,如果使用的是ApplicationContext的話,在ApplicationContext從BeanFactory中加載所有bean的時候,Spring才會創建被代理的物件,因為Spring運行時才創建代理物件,所以我們不需要特殊的編譯器來織入SpringAOP的切面,

Spring只支持方法級別的連接點

因為Spring基于動態代理,所以Spring只支持方法連接點,Spring缺少對欄位連接點的支持,而且它不支持構造器連接點,方法之外的連接點攔截功能,我們可以利用Aspect來補充,

在Spring AOP 中,關注點和橫切關注的區別是什么?在 spring aop 中 concern 和 cross-cutting concern 的不同之處

關注點(concern)是應用中一個模塊的行為,一個關注點可能會被定義成一個我們想實作的一個功能,

橫切關注點(cross-cutting concern)是一個關注點,此關注點是整個應用都會使用的功能,并影響整個應用,比如日志,安全和資料傳輸,幾乎應用的每個模塊都需要的功能,因此這些都屬于橫切關注點,

Spring通知有哪些型別?

在AOP術語中,切面的作業被稱為通知,實際上是程式執行時要通過SpringAOP框架觸發的代碼段,

Spring切面可以應用5種型別的通知:

前置通知(Before):在目標方法被呼叫之前呼叫通知功能;
后置通知(After):在目標方法完成之后呼叫通知,此時不會關心方法的輸出是什么;
回傳通知(After-returning ):在目標方法成功執行之后呼叫通知;
例外通知(After-throwing):在目標方法拋出例外后呼叫通知;
環繞通知(Around):通知包裹了被通知的方法,在被通知的方法呼叫之前和呼叫之后執行自定義的行為,

同一個aspect,不同advice的執行順序:

①沒有例外情況下的執行順序:

around before advice
before advice
target method 執行
around after advice
after advice
afterReturning

②有例外情況下的執行順序:

around before advice
before advice
target method 執行
around after advice
after advice
afterThrowing:例外發生
java.lang.RuntimeException: 例外發生

什么是切面 Aspect?

aspect 由 pointcount 和 advice 組成,切面是通知和切點的結合, 它既包含了橫切邏輯的定義, 也包括了連接點的定義. Spring AOP 就是負責實施切面的框架, 它將切面所定義的橫切邏輯編織到切面所指定的連接點中.
AOP 的作業重心在于如何將增強編織目標物件的連接點上, 這里包含兩個作業:

如何通過 pointcut 和 advice 定位到特定的 joinpoint 上
如何在 advice 中撰寫切面代碼.
可以簡單地認為, 使用 @Aspect 注解的類就是切面.

在這里插入圖片描述
解釋基于XML Schema方式的切面實作

在這種情況下,切面由常規類以及基于XML的配置實作,

解釋基于注解的切面實作

在這種情況下(基于@AspectJ的實作),涉及到的切面宣告的風格與帶有java5標注的普通java類一致,

有幾種不同型別的自動代理?

BeanNameAutoProxyCreator

DefaultAdvisorAutoProxyCreator

Metadata autoproxying

題外

這篇關于Spring面試的分享到這里就結束了,近段時間正值找作業的最佳時間,本人將一些各大廠商的面試題和今年(2020)最新資料的收集,以下是部分資料截圖(所有資料均已整合成檔案,pdf壓縮打包處理),
如有有需要的朋友可以點擊這里來獲取資料,暗號:qf

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/16747.html

標籤:其他

上一篇:CSDN 發布開源代碼托管平臺 CODE.CHINA

下一篇:思科 OSPF協議簡單配置與分析

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more