Spring相關面試題(四)

49 JavaConfig方式如何啟用AOP?如何強制使用cglib?

在JavaConfig類,加上@EnableAspectJAutoProxy

如果要強制使用CGLIB動態代理 ,加上(proxyTargetClass = true)

加上(exposeProxy = true) 就是將對象暴露到線程池中。

50 介紹AOP在Spring中的實現方式。
  1. 接口實現

  2. XML配置

  3. 注解實現

51 AOP什么情況下會失效,怎么解決?

內部調用不會觸發AOP

  1. 方法是private也會失效。

  2. 目標類沒有配置Bean,沒有交給Spring去管理。

  3. 切點表達式沒有配置正確。

解決方法

在方法里面拿到動態代理對象,再去調用目標方法。

  1. 可以注入一個類,IOC會幫你注入增強的代理對象,通過這個對象進行對應的方法的調用,就不會有這些問題。

    1. 注意這里的接收對象,要使用接口來接收,因為這里要注入的代理對象,前面說過SpringAOP中,如果實現了接口,默認是使用JDK的動態代理,而JDK實現動態代理的一個很關鍵的步驟就是:讓這個代理類實現目標類所實現的接口。

  2. 或者在@EnableAspectJAutoProxy(exposeProxy = true) ,在線程中暴露對象。

52 Spring的AOP是在哪里創建的動態代理?
  1. 在Bean初始化后,通過Bean的后置處理器進行動態代理。

  2. 如果在屬性注入的時候,有循環依賴注入的情況,也會使用Bean的后置處理器為Bean生成代理對象。

53 Spring的AOP的完整實現流程

當@EnableAspectJAutoProxy 會通過@lmport注冊一個BeanPostProcessor處理AOP.

  1. 解析切面:在Bean創建之前的第一個Bean后置處理器會去解析切面(解析切面中通知、切點,一個通知就會解析成一個advisor(通知、切點)

  2. 創建動態代理 正常的Bean初始化后調用BeanPostProcessor拿到之前緩存的advisor,再通過advisor中oointcut 判斷當前Bean是否被切點表達式匹配,如果匹配,就會為Bean創建動態代理(創建方式1.jdk動態代理2.cglib)。

  3. 調用:拿到動態代理對象, 調用方法 就會判斷當前方法是否增強的方法, 就會通過調用鏈的方式依次去執行通知.

54 事務的四大特性
  1. A:原子性

    1. 一個事務要么成功,要么失敗。

  2. C:一致性

    1. 從一個狀態轉換成另一個狀態,數據保持一致。

  3. I:隔離性

    1. 多用戶并發操作一張表的時候,數據庫為每一個用戶開啟事務,事務之間都是隔離的,不干擾。

  4. D:持久性

    1. 事務一旦提交了,對數據庫的改變是永久的。

55 Spring支持的事務管理類型,spring事務實現方式有哪些?
  1. 編程式事務:

    1. 比如JDBC中,使用對應的方法開啟一個事務,進行提交、回滾等操作。

  2. 聲明式事務:

    1. @Transactional注解

56 Spring的事務傳播行為
@Transactional
public void function1(){function2(); 
}
@Transactional
public void function2(){//TODO:業務代碼 ?
}

都是針對function2來說的

57 Spring的隔離級別

并發下產生的問題:

  1. 臟讀

    事務2修改了a的值,但是沒有提交事務;這是事務1讀到了事務2修改的值,且事務2又回滾了,產生了數據不一致問題,導致了臟讀。

    @Transactional(isolation = Isolation.READ_COMMITED) //設置成讀已提交。

  2. 不可重復讀

    一個事務中,多次讀取的內容不同:比如事務1在事務2操作的時候讀取a,由于設置成讀已提交,這是事務2沒有提交,所以讀到的值是事務2沒操作之前a的值,但是事務2提交后,事務1再次進行讀取,兩次讀的值不同。

    @Transactional(isolation = Isolation.REPEATABLE_READ) //設置成可重復讀。

    解決方案就是加了行鎖,在事務1操作的時候,不允許別的事務進行操作。

  3. 幻讀

    如果事務1在事務2操作的期間使用統計類的函數,如:sum() ,average()等方法,事務2進行的是insert,就會導致事務1兩次結果不同,因為可重復讀是加的行鎖,解決這個問題需要加表鎖。

    @Transactional(isolation = Isolation.SERIALIZABLE) //設置成最高級別:表鎖。

58 Spring事務實現原理

開啟事務注解:@EnableTrasactionalManagement

原理:

  1. 解析切面 ——> bean的創建第一個后置處理器就行解析。advisor(ponitcut[通過@Transactional解析的切點],advise[這個advice是通過@EnableTrasactionalManagement注冊了一個配置類,該配置類就配置了advisor])

  2. 創建動態代理 ——> bean初始化后,調用Bean的后置處理器,調用后置方法進行動態代理(規則就是原來的內容)。

  3. 調用

    增強的代碼,會把autoCommit設置成false,然后執行方法中的sql語句。

59 Spring事務傳播的原理

主要是在調用這塊:

包括兩個方面:

  • 融入:當傳播行為是融入外部事務,則拿到ThreadLocal的Connection,共享一個數據庫連接共同提交、回滾。

  • 創建新的事物:當傳播行為是創新事務,會將嵌套新事務存入ThreadLocal、再將外部事務暫存起來;當嵌套事務提交、回滾后,會將暫存的事務信息恢復到ThreadLocal中。

比如兩個事務:一個外部,一個內嵌在外部方法中。

  1. 外部:創建一個Connection放到ThreadLocal中,并且修改autoCommit為false,返回事務狀態信息(TransactionInfo.newTransaction())

  2. 外部,執行對應的內嵌方法,

  3. 內嵌:判斷ThreadLocal中是不是已經有了Connection,這時顯然是有的,下一步繼續判斷事務傳播行為:

    1. 融入:

      不會創建新的connection,返回事務狀態信息:TransactionInfo.newTransaction = false

    2. 創建:

      把外層的事務相關的事務信息(Connection、隔離級別、是否只讀...暫存,同時把外層事務的ThreadLocal存儲到事務信息都置空)創建一個Connection,放到ThreadLocal中,發回事務狀態信息

      (TransactionInfo.newTransaction = true ,TransactionInfo也包含暫存的事務信息);判斷newTransaction是不是true,就提交事務,判斷是否暫存事務,把暫存的事務信息回歸。

  4. 外部:

    1. 判斷外部 Transaction.newTransaction = true 提交事務。(有異常就回滾)

60 Spring多線程事務,能否保持一致性

比如:

public viod test(){int result = testDao.getCount();new Thread(()->{//進行數據庫的操作}).start();
}

1.Spring的事務信息是存在ThreadLǎcal中的Connection,所以一個線程永遠只能有一個事務

2.所以Spring 的事務是無法實現事務一致性的

3.可以通過編程式事務,或者通過分布式事務的思路:二階段提交方式

61 Spring事務失效的原因

Spring是基于AOP來的。

  1. 方法是private

  2. 目標類沒有交給spring IOC管理

  3. 自己捕獲了異常,沒有把異常拋出。

  4. 使用cglib動態代理,但是@Transactional聲明在接口上面。

內部調用不會觸發。

內部方法沒有走的代理,比如:

public void way1(){this.way2();
}
?
@Trasactional(propagation = Propagation.REQUIRES_NEW)
public void way2(){}

這時,可以在重新注入自己一遍。

62 Spring事件監聽的核心機制

原理

觀察者模式

Spring事件監聽有三個部分組成

  • 事件:負責對應相應監聽器事件源發生事件是特定的事件監聽器被觸發的原因。

  • 監聽器:對應于觀察者模式中的觀察者。監聽器監聽特定的事件,并在內部定義了事件發生后的邏輯響應。

  • 事件發布器:對應于觀察者模式中的被觀察者/主題, 負責通知觀察者 對外提供發布事件和增刪事件監聽器的接口,維護事件和事件監聽器之間的映射關系,并在事件發生時負責通知相關監聽器。

支持異步

異步發布事件的核心機制:

多線程。

63 Spring如如何整合Mybatis,管理Mapper接口的呢?

實現:基于JDK的動態代理。

  1. Spring會排除接口,無法注冊到IOC容器中

  2. MyBatis 實現了BeanDefinitionRegistryPostProcessor 可以動態注冊BeanDefinition

  3. 需要自定義掃描器(繼承Spring內部掃描器ClassPathBeanDefinitionScanner)重寫排除接口的方法(isCandidateComponent5.但是接口雖然注冊成了BeanDefinition但是無法實例化Bean 因為接口無法實例化

  4. 需要將BeanDefinition的BeanClass 替換成JDK動態代理的實例(偷天換日)

  5. Mybatis 通過FactoryBean的工廠方法設計模式可以自由控制Bean的實例化過程,可以在getObject方法中創建JDK動態代理

64 解決SpringMVC中修正POST 和 GET 方法亂碼問題
  1. web.xml中配置一個CharacterEncodingFilter過濾器,設置成utf-8。

    <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.characterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param>
    ?<filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
    </filter>
  2. 修改Tomcat配置文件的編碼。

  3. 對參數進行重新編碼。

65 SpringMVC的控制器是不是單例模式,如果是,有什么問題,怎么解決?

避免在類中聲明成員變量,否則就會存在線程安全問題;如果有必須需要,可以放到ThreadLocal中去,因為ThreadLocal是一個線程對應一個對象。

也可以使用線程鎖,但是會影響性能。

66 SpringMVC的工作流程?描述一下DispatcherServlet的工作流程?

DispatcherServlet 核心調度器和前端處理器。

  1. 用戶發送請求至前端控制器DispatcherServlet;

  2. DispatcherServlet收到請求后,調用HandlerMapping處理器映射器,請求獲取Handle;

  3. 處理器映射器根據請求ur1找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet

  4. DispatcherServlet 調用 HandlerAdapter處理器適配器;

  5. HandlerAdapter 經過適配調用 具體處理器(Handler,也叫后端控制器);

  6. Handler執行完成返回ModelAndView;

  7. HandlerAdapter將Handler執行結果ModelAndView返回給DispatcherServlet,

  8. DispatcherServlet將ModelAndView傳給ViewResolver視圖解析器進行解析;

  9. ViewResolver解析后返回具體View;

  10. DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中) DispatcherServlet啊應用戶。

?

67 SpringMVC 中如何處理AJAX請求?
  1. 加入Jackson依賴

  2. 在配置文件中配置json的消息轉換器。(jackson不需要配置HttpMessageConvert 消息轉換器)

    <mvc:annotaion-driven conversion-service="conversionService" />
  3. 在接受AJAX請求的方法上就可以加入@RequestBody等注解,就可以自定接受JSON文本,轉換成對象。

68 Spring和SpringMVC為什么需要父子容器?
  1. 主要作用是劃分邊界:Dao和Service層主要通過Spring的容器進行管理;controller一般通過SpringMVC的容器。

  2. 規范架構:父容器service無法訪問子容器controller,子容器controller可以訪問父容器的service。

  3. 將方便子容器的切換。如果我們想把web層從SpringMVC改成struts,只需要將spring-mvc.xml換成Struts的配置文件,Spring的配置文件是不需要改變的。

  4. 為了節省重復Bean創建。

69 是否可以把SpringMVC中的所有的Bean都交給Spring容器來管理?

不可以,這樣會導致我們請求接口的時候產生404。如果所有的Bean都交給父容器,SpringMVC在初始化HandlerMethods的時候(initHandlerMethods)無法根據Controller的handler方法注冊HandlerMethod,并沒有去査找父容器的bean;也就無法根據請求URI獲取到 HandlerMethod來進行匹配,只有getBean才是從父容器中拿。

70 是否可以把Spring容器中的所有的Bean放到SpringMVC中進行管理。

可以,因為父容器的體現無非是為了獲取子容器不包含的bean,如果全部包含在子容器完全用不到父容器了, 所以是可以全部放在springmvc子容器來管理。 雖然可以這么做不過一般應該是不推薦這么去做的,一般人也不會這么干的。如果你的項目里有用到事物、或者aop記得也需要把這部分配置需要放到Spring-mvc子容器的配置文件來,不然一部分內容在子容器和一部分內容在父容器,可能就會導致你的事物或者AOP不生效。所以如果aop或事物如果不牛效也,有可能是通討父容器(Spring)去增強子容器(SpringMVC),也就無法增強。

71 如和實現零配置的SpringMVC?原來是什么?

JavaConfig的配置方式。

  1. 省略web.xml

    1. servlet3.0之后規范中提供了SPI擴展:META-INF/services/javax.servlet.ServletContainerlnitializer

    2. SpringMVC通過實現ServletContainerlnitializer接囗

    3. 動態注冊ContextLoaderListener 和DispatcherServlet并創建子父容器(Application)

  2. 省略spring.xml和spring-mvc.xml(只是sprinmvc方式,springboot在自動配置類完成)

    1. 實現一個繼承AbstractAnnotationConfigDispatcherServletlnitializer的類

    2. 該類就實現了ServetContainernitializer,它會創建ContextLoaderListener 和DispatcherServlet

    3. 還會創建父子容器,創建容器時傳入父子容器配置類則可以替代spring.xml和spring-mvc.xml

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43896.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43896.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43896.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【3】遷移學習模型

【3】遷移學習模型 文章目錄 前言一、安裝相關模塊二、訓練代碼2.1. 管理預訓練模型2.2. 模型訓練代碼2.3. 可視化結果2.4. 類別函數 總結 前言 主要簡述一下訓練代碼 三葉青圖像識別研究簡概 一、安裝相關模塊 #xingyun的筆記本 print(xingyun的筆記本) %pip install d2l %…

詳解TCP和UDP通信協議

目錄 OSI的七層模型的主要功能 tcp是什么 TCP三次握手 為什么需要三次握手&#xff0c;兩次握手不行嗎 TCP四次揮手 揮手會什么需要四次 什么是TCP粘包問題&#xff1f;發生的原因 原因 解決方案 UDP是什么 TCP和UDP的區別 網絡層常見協議 利用socket進行tcp傳輸代…

【js面試題】深入理解DOM操作:創建、查詢、更新、添加和刪除節點

面試題&#xff1a;DOM常見的操作有哪些 引言&#xff1a; 在前端開發中&#xff0c;DOM&#xff08;文檔對象模型&#xff09;操作是日常工作中不可或缺的一部分。DOM提供了一種以編程方式訪問和更新文檔內容、結構和樣式的接口。 任何html或 xml 文檔都可以用dom表示為一個由…

KIVY Button?

Button — Kivy 2.3.0 documentation Button Jump to API ? Module: kivy.uix.button Added in 1.0.0 The Button is a Label with associated actions that are triggered when the button is pressed (or released after a click/touch). To configure the button, the s…

【論文速讀】| 用于安全漏洞防范的人工智能技術

本次分享論文&#xff1a;Artificial Intelligence Techniques for Security Vulnerability Prevention 基本信息 原文作者&#xff1a;Steve Kommrusch 作者單位&#xff1a;Colorado State University, Department of Computer Science, Fort Collins, CO, 80525 USA 關鍵…

ISO/OSI七層模型

ISO:國際標準化/ OSI:開放系統互聯 七層協議必背圖 1.注意事項&#xff1a; 1.上三層是為用戶服務的&#xff0c;下四層負責實際數據傳輸。 2.下四層的傳輸單位&#xff1a; 傳輸層&#xff1b; 數據段&#xff08;報文&#xff09; 網絡層&#xff1a; 數據包&#xff08;報…

1Panel安裝命令腳本大全,多Linux操作系統版本

1Panel安裝命令腳本大全&#xff0c;包括RedHat、CentOS、Ubuntu、Debian和openEuler等linux操作系統&#xff0c;碼筆記整理1Panel安裝命令腳本清單&#xff1a; RedHat/CentOS安裝命令&#xff1a; curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh…

【Swoole 的生命周期,文件描述符,協程數量,以及默認值】

目錄 Swoole 的生命周期 Swoole 文件描述符&#xff08;FD&#xff09;緩存 Swoole設置協程的數量 Swoole 默認值 Swoole 是一個基于 PHP 的高性能網絡通信引擎&#xff0c;它采用 C 編寫&#xff0c;提供了協程和高性能的網絡編程支持。Swoole 支持多種網絡服務器和客戶端…

python庫 - modelscope

ModelScope 是一個集成的機器學習模型庫&#xff0c;旨在簡化機器學習模型的使用流程&#xff0c;提供多種預訓練模型&#xff0c;涵蓋計算機視覺、自然語言處理、語音識別等多個領域。用戶可以輕松訪問、使用和分享各種預訓練的機器學習模型&#xff0c;無需從頭開始訓練模型&…

Vue項目openlayers中使用jsts處理wkt和geojson的交集-(geojson來源zpi解析)

Vue項目openlayers中使用jsts處理wkt和geojson的交集-(geojson來源zpi解析) 讀取壓縮包中的shape看上一篇筆記&#xff1a;Vue項目讀取zip中的ShapeFile文件&#xff0c;并解析為GeoJson openlayers使用jsts官方示例&#xff1a;https://openlayers.org/en/latest/examples/j…

框選table單元格,高亮展示

td單元格內&#xff0c;有未知層dom結構 <style>.highlight {background-color: yellow;} </style> <table id"myTable"><colgroup><col style"background-color: lightblue;"><col style"background-color: light…

#pragma 指令

#pragma 指令作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作 message 參數能夠在編譯信息輸出窗口中輸出相應的信息 #pragma message(“消息文本”) code_seg參數能夠設置程序中函數代碼存放的代碼段&#xff0c;當我們開發驅動程序的時候就會使用到它 #pragma…

科技創新引領水利行業升級:深入分析智慧水利解決方案的核心價值,展望其在未來水資源管理中的重要地位與作用

目錄 引言 一、智慧水利的概念與內涵 二、智慧水利解決方案的核心價值 1. 精準監測與預警 2. 優化資源配置 3. 智能運維管理 4. 公眾參與與決策支持 三、智慧水利在未來水資源管理中的重要地位與作用 1. 推動水利行業轉型升級 2. 保障國家水安全 3. 促進生態文明建設…

下降npm版本

Node版本與NPM版本對應關系 Node版本與NPM版本對應關系_node對應npm版本-CSDN博客 要降低npm的版本&#xff0c;可以按照以下步驟進行操作 1.首先&#xff0c;打開終端或命令提示符窗口。 2.輸入以下命令來檢査當前安裝的npm版本: npm -v 3.如果你想要降低npm的版本&#xff…

vb.netcad二開自學筆記5:ActiveX鏈接CAD的.net寫法

一、必不可少的對象引用 使用activex需要在項目屬性中勾選以下兩個引用&#xff0c;若找不到&#xff0c;則瀏覽定位直接添加下面兩個文件&#xff0c;可以看到位于cad的安裝路徑下&#xff0c;圖中的3個mgd.dll也可以勾選。 C:\Program Files\Autodesk\AutoCAD 2024\Autodes…

實戰 | YOLOv8使用TensorRT加速推理教程(步驟 + 代碼)

導 讀 本文主要介紹如何使用TensorRT加速YOLOv8模型推理的詳細步驟與演示。 YOLOv8推理加速的方法有哪些? YOLOv8模型推理加速可以通過多種技術和方法實現,下面是一些主要的策略: 1. 模型結構優化 網絡剪枝:移除模型中不重要的神經元或連接,減少模型復雜度。 模型精…

中文大模型基準測評2024上半年報告

中文大模型基準測評2024上半年報告 原創 SuperCLUE CLUE中文語言理解測評基準 2024年07月09日 18:09 浙江 SuperCLUE團隊 2024/07 背景 自2023年以來&#xff0c;AI大模型在全球范圍內掀起了有史以來規模最大的人工智能浪潮。進入2024年&#xff0c;全球大模型競爭態勢日益加…

Obsidian 文檔編輯器

Obsidian是一款功能強大的筆記軟件 Download - Obsidian

降Compose十八掌之『見龍在田』| Modifier

公眾號「稀有猿訴」 原文鏈接 降Compose十八掌之『見龍在田』| Modifier 通過前面的文章我們學會了如何使用元素來構建和填充我們的UI頁面&#xff0c;但這只完成了一半&#xff0c;元素還需要裝飾&#xff0c;以及進行動畫和事件響應&#xff0c;這才能生成完整的UI。這…

2.5章節python中布爾類型

在Python中&#xff0c;布爾類型&#xff08;Boolean type&#xff09;用于表示真&#xff08;True&#xff09;或假&#xff08;False&#xff09;的值。這是編程中非常基礎且重要的一個概念&#xff0c;因為它允許程序進行條件判斷&#xff0c;從而根據條件執行不同的代碼塊。…