<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          spring面試連環(huán)炮,最后一問才是經(jīng)典

          共 3896字,需瀏覽 8分鐘

           ·

          2022-03-17 06:09

          走過路過不要錯過

          點擊藍字關(guān)注我們


          1.什么是Spring

          spring是一個輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架

          • 從大小與開銷而言是輕量級的

          • 通過控制反轉(zhuǎn)的技術(shù)達到松耦合的目的

          • 通過面向切面,允許通過分離應(yīng)用的業(yè)務(wù)邏輯與系統(tǒng)即服務(wù)進行內(nèi)聚性開發(fā)

          • 包含并管理應(yīng)用對象Bean的配置和生命周期,這個意義上是一個容器

          • 將簡單的組建配置,組合成復(fù)雜的應(yīng)用,這個意義上是一個框架

          2.談?wù)勀銓OP的理解

          AOP--面向切面編程:能夠?qū)⒛切┡c業(yè)務(wù)無關(guān)的,但為業(yè)務(wù)模塊所共用的一些邏輯,如(事務(wù)管理,日志管理)封裝起來,減少重復(fù)代碼,降低耦合,并有利于未來的可擴展性和可維護性。

          Spring AOP是基于動態(tài)代理的,如果要代理的對象實現(xiàn)了某個接口,Spring AOP就會使用JDK動態(tài)代理去創(chuàng)建代理對象;對于沒有實現(xiàn)接口的對象,無法使用JDK動態(tài)代理,而去使用CGlib動態(tài)代理生成一個被代理對象的子類來作為代理。使用AOP可以將一些通用功能抽象出來,如日志管理、事務(wù)管理和權(quán)限管理等,使用時直接調(diào)用即可,避免代碼重復(fù)。

          3.談?wù)勀銓oC(控制反轉(zhuǎn))的理解

          • 1.容器概念:ioc容器,里面存放著各種對象,在項目啟動時,讀取配置文件里的bean節(jié)點,根據(jù)全限定類名使用反射放到容器中,此時容器里就有各種對象了,接下來在需要時,進行依賴注入。

          • 2.控制反轉(zhuǎn):在沒有引入ioc容器之前,對象A依賴于對象B,其中對象B的創(chuàng)建與使用的控制權(quán)掌握在A手中,在引入ioc容器之后,對象A與B之間失去了直接聯(lián)系,當(dāng)對象A運行到需要的對象B時,由IOC榮日主動創(chuàng)建對象B注入到A需要的地方。對象A獲取依賴對象B的過程,從主動變?yōu)榱吮粍樱刂茩?quán)顛倒,因此稱為依賴反轉(zhuǎn)。

          • 3.依賴注入:控制反轉(zhuǎn)之后,獲取依賴對象的過程由自身管理變?yōu)榱擞蒊OC容器主動注入。依賴注入是實現(xiàn)IOC的方法,在容器運行期間,動態(tài)的將依賴關(guān)系注入到對象之中。

          4.BeanFactory與ApplicationContext的區(qū)別

          ApplicationContext是BeanFactory的子接口,ApplicationContext提供了更完整的功能

          • 1.統(tǒng)一的資源文件訪問方式

          • 2.繼承MessageSource,支持國際化

          • 3.同時加載多個配置文件

          區(qū)別

          • BeanFactory采用延時加載來注入Bean,只有在用到某個Bean時,才對其實例化。這樣就不能發(fā)現(xiàn)一些存在的Spring配置問題。

          • ApplicationContext在容器啟動時,一次性創(chuàng)建所有的Bean。在啟動時就可以發(fā)現(xiàn)Spring中存在的配置問題,有利于檢查依賴屬性是否注入。

          • 相比于BeanFactory,ApplicationContext唯一不足是占用內(nèi)存空間,當(dāng)應(yīng)用程序配置Bean較多時,程序啟動較慢。

          5.簡述Spring中Bean的生命周期

          • 1.解析類獲取BeanDefinition

          • 2.如果有多個構(gòu)造方法,推斷構(gòu)造方法

          • 3.確定好構(gòu)造方法后,進行實例化獲取對象

          • 4.對對象中加了@Autowired注解的屬性進行填充

          • 5.回調(diào)Aware方法,如BeanNameAware

          • 6.調(diào)用BeanPostProcessor初始化前的方法

          • 7.調(diào)用初始化方法

          • 8.調(diào)用BeanPostProcessor初始化后的方法,在這里進行AOP

          • 9.如果創(chuàng)建的bean是單例會將bean放入單例池

          • 10.使用Bean

          • 11.spring關(guān)閉時,調(diào)用destroy()方法

          6.解釋一下Spring支持的幾種Bean的作用域

          • 1.singleton:Spring中默認的bean都是單例的,每個容器只有一個bean實例,該對象的生命周期與Spring IOC容器一致

          • 2.prototype:為每一個bean請求創(chuàng)建一個實例

          • 3.request:在每個http請求中創(chuàng)建一個單例對象,在單個請求中都會復(fù)用該對象,該 bean 僅在當(dāng)前 HTTP request 內(nèi)有效

          • 4.session:在每個http請求中創(chuàng)建一個單例對象,該 bean 僅在當(dāng)前 HTTP session 內(nèi)有效

          • 5.global-session:全局作用域,基于portlet 的 web 應(yīng)?中才有意義,Spring5 已經(jīng)沒有了。

          7.Spring框架中單例Bean是線程安全的嗎?

          不是線程安全的,框架并沒有對bean進行多線程的封裝處理。
          主要是因為:當(dāng)多個線程操作同一個對象時,對這個對象的非靜態(tài)變量成員的寫會存在線程安全問題。

          解決方法:

          • 1.在類中定義一個ThreadLocal成員變量,將需要的可變成員變量保存在ThreadLocal中

          • 2.如果是多線程之間共享,需要使用lock、synchronized、CAS等實現(xiàn)線程同步的方法。

          8.Spring框架中使用到了哪些設(shè)計模式

          • 1.單例設(shè)計模式:Spring中的bean默認都是單例的

          • 2.代理設(shè)計模式:Spring中AOP功能的實現(xiàn)

          • 3.工廠設(shè)計模式:Spring使用工廠模式通過BeanFactory、ApplicationContext創(chuàng)建Bean對象

          • 4.模板方法模式:Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 結(jié)尾的對數(shù)據(jù)庫操作的類,它們就使?到了模板模式;

          • 5.包裝器設(shè)計模式:項目需要鏈接不同的數(shù)據(jù)庫,不同的客戶在每次訪問中去訪問不同的數(shù)據(jù)庫。

          • 6.適配器模式:Spring中AOP的通知(Advice)使用了適配器模式。

          9.Spring事務(wù)的實現(xiàn)方式和原理以及隔離級別

          實現(xiàn)方式

          事務(wù)的實現(xiàn)方式有兩種:一種是編程式,一種是聲明式,如使用@Transactional注解

          原理
          在一個方法上加了@Transactional注解之后,Spring基于這個類生成一個代理對象,將這個代理對象作為bean放入IOC容器,在調(diào)用代理對象方法時,如果方法存在@Transactional注解,那么代理兌獎事務(wù)的自動提交設(shè)置為false,再去執(zhí)行原本的業(yè)務(wù)邏輯,如果沒有異常,那么代理就會將事務(wù)提交,否則將事務(wù)回滾。

          10.談?wù)勀銓pring中事務(wù)的理解以及Spring中的事務(wù)隔離級別

          事務(wù):是一個完整的業(yè)務(wù)邏輯,最小的工作單元,不可再分。要么同時執(zhí)行成功,要么同時失敗

          事物的四個特性(ACID):

          • 原子性:事務(wù)是最小的工作單元,不可分割

          • 一致性:在同一個事務(wù)中,所有要求必須同時成功,或者同時失敗,保證數(shù)據(jù)一致性

          • 隔離性:當(dāng)并發(fā)訪問數(shù)據(jù)庫時,一個是用戶的事務(wù)不受其他事務(wù)的干擾,各并發(fā)事務(wù)之間的數(shù)據(jù)庫是獨立的

          • 持久性:事務(wù)提交之后,它對數(shù)據(jù)庫中數(shù)據(jù)的改變是持久的。

          Spring中事物的隔離級別(四個)

          • 1.讀未提交--read uncommited(最低隔離級別) 問題:存在臟讀現(xiàn)象

          • 2.讀已提交--read commited(Oracle數(shù)據(jù)庫默認級別) 問題:不可重復(fù)讀

          • 3.可重復(fù)讀--repeatable read(MySQL數(shù)據(jù)庫默認級別) 問題:存在幻讀現(xiàn)象

          • 4.序列化--serializable(最高隔離級別) 問題:不能并發(fā),效率最低

          11.Spring中的事務(wù)傳播行為

          事務(wù)傳播?為是為了解決業(yè)務(wù)層?法之間互相調(diào)?的事務(wù)問題。當(dāng)事務(wù)?法被另?個事務(wù)?法調(diào)?時,必須指定事務(wù)應(yīng)該如何傳播。

          支持當(dāng)前事務(wù)的情況:

          • REQUIRED(默認):如果當(dāng)前存在事務(wù),則加?該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建?個新的事務(wù);

          • SUPPORTS:如果當(dāng)前存在事務(wù),則加?該事務(wù);如果當(dāng)前沒有事務(wù),則以?事務(wù)的?式繼續(xù)運?;

          • MANDATORY:如果當(dāng)前存在事務(wù),則加?該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。

          不支持當(dāng)前事務(wù)的情況:

          • REQUIRES_NEW:創(chuàng)建?個新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起;

          • NOT_SUPPORTED::以?事務(wù)?式運?,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。

          • NEVER:以?事務(wù)?式運?,如果當(dāng)前存在事務(wù),則拋出異常

          其他情況

          NESTED:如果當(dāng)前存在事務(wù),則創(chuàng)建?個事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運?;如果當(dāng)前沒有事務(wù),則該取值等價于REQUIRED

          12.spring事務(wù)什么時候會失效

          • 1.發(fā)生自調(diào)用,類里面使用this調(diào)用本類的方法,此時這個this對象不是代理類。

          • 2.方法不是public的,@Transactional只能用在public的方法上,否則方法不會生效,如果非要用在不是public的方法上,開啟AspectJ代理模式

          • 3.數(shù)據(jù)庫不支持事務(wù)

          • 4.沒有被spring管理

          • 5.異常被吃掉,事務(wù)不會回滾

          13.bean的自動裝配有哪些方式?

          五種

          • 1.no-手動配置,通過'ref'手動設(shè)定

          • 2.byName,通過bean的屬性名稱自動裝配

          • 3.byType,通過bean的類型進行自動裝配

          • 4.constructor,通過bean的類型與構(gòu)造器參數(shù)相同進行裝配

          • 5.autodetect,如果有默認構(gòu)造器,則通過constructor進行自動裝配,否則使用byType自動裝配



          -END-

          最近是面試的高峰期,有一些小伙伴,讓我?guī)兔φ乙恍┟嬖囶}資料,于是我翻遍了收藏的6T資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,需要的小伙伴轉(zhuǎn)發(fā)+關(guān)注后私信我回復(fù)【666】即可獲取,歡迎下載~~~~


          瀏覽 109
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲精品v日韩精品 | 日韩欧美一级特黄大片 | 高潮免费视频 | 污的网站在线观看豆花视频 | 99热12 |