整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          面試突擊66:請求轉發和請求重定向有什么區別?

          面試突擊66:請求轉發和請求重定向有什么區別?

          Java 中,跳轉的實現方式有兩種:請求轉發和請求重定向,但二者是完全不同的,所以我們今天就來盤它。

          請求轉發和請求重定向主要區別,包含以下 5 點:

          1. 定義不同
          2. 跳轉方不同
          3. 數據共享不同
          4. 最終 URL 地址不同
          5. 代碼實現不同

          接下來,我們一個一個來看。

          1.定義不同

          請求轉發(Forward):發生在服務端程序內部,當服務器端收到一個客戶端的請求之后,會先將請求,轉發給目標地址,再將目標地址返回的結果轉發給客戶端。而客戶端對于這一切毫無感知的,這就好比,張三(客戶端)找李四(服務器端)借錢,而李四沒錢,于是李四又去王五那借錢,并把錢借給了張三,整個過程中張三只借了一次款,剩下的事情都是李四完成的,這就是請求轉發。

          請求重定向(Redirect):請求重定向指的是服務器端接收到客戶端的請求之后,會給客戶端返回了一個臨時響應頭,這個臨時響應頭中記錄了,客戶端需要再次發送請求(重定向)的 URL 地址,客戶端再收到了地址之后,會將請求發送到新的地址上,這就是請求重定向。這就好像張三(客戶端)找李四(服務器端)借錢,李四沒錢,于是李四就告訴張三,“我沒錢,你去王五那借“,于是張三又去王五家借到了錢,這就是請求重定向。

          2.請求方不同

          從上面請求轉發和請求重定向的定義,我們可以看出:請求轉發是服務器端的行為,服務器端代替客戶端發送請求,并將結果返回給客戶端;而請求重定向是客戶端的行為,它們的交互流程,如下圖所示:

          3.數據共享不同

          請求轉發是服務器端實現的,所以整個執行流程中,客戶端(瀏覽器端)只需要發送一次請求,因此整個交互過程中使用的都是同一個 Request 請求對象和一個 Response 響應對象,所以整個請求過程中,請求和返回的數據是共享的;而請求重定向客戶端發送兩次完全不同的請求,所以兩次請求中的數據是不同的。

          4.最終 URL 地址不同

          請求轉發是服務器端代為請求,再將結果返回給客戶端的,所以整個請求的過程中 URL 地址是不變的;而請求重定向是服務器端告訴客戶端,“你去另一個地訪問去”,所以瀏覽器會重新再發送一次請求,因此客戶端最終顯示的 URL 也為最終跳轉的地址,而非剛開始請求的地址,所以 URL 地址發生了改變。

          5.代碼實現不同

          在 SpringBoot 中,請求轉發的實現代碼如下:

          @RequestMapping("/fw")
          public void forward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              request.getRequestDispatcher("/index.html").forward(request, response);
          }

          而請求重定向的實現代碼如下:

          @RequestMapping("/rt")
          public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
              response.sendRedirect("/index.html");
          }

          總結

          請求轉發和請求重定向遵循的是“字越少,事越大”的原則,“請求轉發”的字比較少,它需要代客戶端執行跳轉;而“請求重定向”字比較多,它啥也不干,只是告訴客戶端“你去別的地兒訪問”就行了,這就是理解這兩個概念的關鍵。它們的區別主要體現在 5 個點:定義不同、請求方不同、數據共享不同、最終 URL 地址不同、代碼實現不同。

          參考 & 鳴謝

          www.jianshu.com/p/81407dff803d

          www.cnblogs.com/su-chu-zhi-151/p/11875641.html

          、跳轉的方式

          轉發: forward

          重定向: redirect

          2、轉發和重定向代碼怎么完成

          1、轉發
          //請求轉發到/b對應的Servlet
          request.getRequestDispatcher("/b").forward(request,response);
          
          2、重定向
          response.sendRedirect(request.getContextPath() + "/b");

          3、轉發和重定向的區別?

          相同點:都可以完成資源的跳轉

          不同點:

          轉發是request對象觸發的,服務器內部進行轉發

          重定向是response對象觸發的,要將重定向的路徑相應給瀏覽器

          轉發是一次請求,瀏覽器地址欄上地址不變

          重定向是兩次請求,瀏覽器地址欄上的地址發生變化

          重定向路徑需要加項目名(webapp跟路徑web目錄)

          轉發是在本項目內部完成資源的跳轉

          重定向可以完成跨app跳轉,例如可以跳轉到https://www.baidu.com

          4、什么時候采用轉發,什么時候采用重定向

          1、大部分情況下都使用重定向

          2、若想完成跨app跳轉,必須采用重定向

          若在上一個資源中向request范圍中存儲了數據,希望在下一個資源中從request范圍中取出,必須使用轉發

          3、重定向可以解決瀏覽器的刷新問題

          5、重定向解決頁面刷新問題

          中篇

          三、Java Web

          1、Servlet和JSP

          1. jsp 和 servlet 有什么區別
          • 聯系:
            jsp經編譯后就變成了servlet,jsp本質就是servlet,jvm只能識別java的類,不能識別jsp代碼,web容器將jsp的代碼編譯成jvm能夠識別的java類
          • 區別:
            JSP側重視圖,Sevlet主要用于控制邏輯。
            Servlet中沒有內置對象 。
            JSP中的內置對象都是必須通過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象得到。
          1. jsp 有哪些內置對象?作用分別是什么
            JSP有9個內置對象:
            (1)request:封裝客戶端的請求,其中包含來自GET或POST請求的參數;
            (2)response:封裝服務器對客戶端的響應;
            (3)pageContext:通過該對象可以獲取其他對象;
            (4)session:封裝用戶會話的對象;
            (5)application:封裝服務器運行環境的對象;
            (6)out:輸出服務器響應的輸出流對象;
            (7)config:Web應用的配置對象;
            (8)page:JSP頁面本身(相當于Java程序中的this);
            (9)exception:封裝頁面拋出異常的對象。
          2. jsp 的 4 種作用域
            JSP中的四種作用域包括page、request、session和application,具體來說:
            (1)page代表與一個頁面相關的對象和屬性。
            (2)request代表與Web客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web組件;需要在頁面顯示的臨時數據可以置于此作用域。
            (3)session代表與某個用戶與服務器建立的一次會話相關的對象和屬性。跟某個用戶相關的數據應該放在用戶自己的session中。
            (4)application代表與整個Web應用程序相關的對象和屬性,它實質上是跨越整個Web應用程序,包括多個頁面、請求和會話的一個全局作用域。
          3. session 和 cookie 有什么區別
            cookie和session的區別https://www.cnblogs.com/mark5/p/11641131.html
          4. session 的工作原理
            session相關面試題https://www.cnblogs.com/jxxblogs/p/12071196.html
          5. 如果客戶端禁止 cookie 能實現 session 還能用嗎
            不能,且服務端因為沒有得到PHPSESSIONID的cookie,會不停的生成session_id文件。但是可以通過其他方法在禁用 cookie 的情況下,可以繼續使用session。
            (1)通過url重寫,把 sessionid 作為參數追加的原 url 中,后續的瀏覽器與服務器交互中攜帶 sessionid 參數。
            (2)服務器的返回數據中包含 sessionid,瀏覽器發送請求時,攜帶 sessionid 參數。
            (3)通過 Http 協議其他 header 字段,服務器每次返回時設置該 header 字段信息,瀏覽器中 js 讀取該 header 字段,請求服務器時,js設置攜帶該 header 字段。
          6. Servlet的運行過程
            Servlet程序是由WEB服務器調用,web服務器收到客戶端的Servlet訪問請求后:
            ①Web服務器首先檢查是否已經裝載并創建了該Servlet的實例對象。如果是,則直接執行第④步,否則,執行第②步。
            ②裝載并創建該Servlet的一個實例對象。
            ③調用Servlet實例對象的init()方法。
            ④創建一個用于封裝HTTP請求消息的HttpServletRequest對象和一個代表HTTP響應消息的HttpServletResponse對象,然后調用Servlet的service()方法并將請求和響應對象作為參數傳遞進去。
            ⑤WEB應用程序被停止或重新啟動之前,Servlet引擎將卸載Servlet,并在卸載之前調用Servlet的destroy()方法。
          7. http 響應碼
            1xx: 信息
            2xx: 成功
            3xx: 重定向
            4xx: 客戶端錯誤
            5xx: 服務器錯誤
            HTTP響應碼詳細介紹https://www.cnblogs.com/okcy/p/11376068.html
          8. forward 和 redirect 的區別
            forward 和 redirect 的區別https://blog.csdn.net/zhc5885306/article/details/78763905

          2、框架

          Spring

          1. 為什么要使用 spring
          • 特點:
            (1)方便解耦,便于開發(Spring就是一個大工廠,可以將所有對象的創建和依賴關系維護都交給spring管理)
            (2)spring支持aop編程(spring提供面向切面編程,可以很方便的實現對程序進行權限攔截和運行監控等功能)
            (3)聲明式事務的支持(通過配置就完成對事務的支持,不需要手動編程)
            (4)方便程序的測試,spring 對junit4支持,可以通過注解方便的測試spring 程序
            (5)方便集成各種優秀的框架()
            (6)降低javaEE API的使用難度(Spring 對javaEE開發中非常難用的一些API 例如JDBC,javaMail,遠程調用等,都提供了封裝,是這些API應用難度大大降低)
          1. 什么是 aop
          • AOP相關概念:
            1)方面(Aspect):一個關注點的模塊化,這個關注點實現可能另外橫切多個對象。事務管理是J2EE應用中一個很好的橫切關注點例子。方面用spring的 Advisor或攔截器實現。
            2)連接點(Joinpoint): 程序執行過程中明確的點,如方法的調用或特定的異常被拋出。
            3)通知(Advice): 在特定的連接點,AOP框架執行的動作。各種類型的通知包括“around”、“before”和“throws”通知。通知類型將在下面討論。許多AOP框架包括Spring都是以攔截器做通知模型,維護一個“圍繞”連接點的攔截器鏈。Spring中定義了四個advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice
            4)切入點(Pointcut): 指定一個通知將被引發的一系列連接點的集合。AOP框架必須允許開發者指定切入點:例如,使用正則表達式。 Spring定義了Pointcut接口,用來組合MethodMatcher和ClassFilter,可以通過名字很清楚的理解, MethodMatcher是用來檢查目標類的方法是否可以被應用此通知,而ClassFilter是用來檢查Pointcut是否應該應用到目標類上
            5)引入(Introduction): 添加方法或字段到被通知的類。 Spring允許引入新的接口到任何被通知的對象。例如,你可以使用一個引入使任何對象實現 IsModified接口,來簡化緩存。Spring中要使用Introduction, 可有通過DelegatingIntroductionInterceptor來實現通知,通過DefaultIntroductionAdvisor來配置Advice和代理類要實現的接口
            6)目標對象(Target Object): 包含連接點的對象。也被稱作被通知或被代理對象。POJO
            7)AOP代理(AOP Proxy): AOP框架創建的對象,包含通知。 在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。
            8)織入(Weaving): 組裝方面來創建一個被通知對象。這可以在編譯時完成(例如使用AspectJ編譯器),也可以在運行時完成。Spring和其他純Java AOP框架一樣,在運行時完成織入
          • AOP使用場景:
            Authentication 權限
            Caching 緩存
            Context passing 內容傳遞
            Error handling 錯誤處理
            Lazy loading 懶加載
            Debugging  調試
            logging, tracing, profiling and monitoring 記錄跟蹤 優化 校準
            Performance optimization 性能優化
            Persistence  持久化
            Resource pooling 資源池
            Synchronization 同步
            Transactions 事務
          1. 什么是 ioc
            IOC控制反轉:IOC容器 控制 應用程序
            DI依賴注入:應用程序 依賴 IOC容器
            應用程序需要IoC容器來提供對象需要的外部資源(包括對象、資源、常量數據)
            通常使用@Autowired注解來注入外部資源
            【控制反轉是目標,依賴注入是手段】
            IOC作用:松耦合,可維護性好
          2. spring 有哪些主要模塊
            每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現.
            核心組件:Core、Context 和 Beans
          • Spring Core(核心容器):核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開。
          • Spring Context(上下文):Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如:JNDI、EJB、電子郵件、國際化、校驗和調度功能。
          • Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基于 Spring 的應用程序中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程序中。
          • Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,并且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。
          • Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。
          • Spring Web 模塊:Web 上下文模塊建立在應用程序上下文模塊之上,為基于 Web 的應用程序提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。
          • Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。
          • 各模塊依賴關系
            IOC 的實現包 spring-beans 和 AOP 的實現包 spring-aop 也是整個框架的基礎,而 spring-core 是整個框架的核心,基礎的功能都在這里。
            在此基礎之上,spring-context 提供上下文環境,為各個模塊提供粘合作用。
            在 spring-context 基礎之上提供了 spring-tx 和 spring-orm包,而web部分的功能,都是要依賴spring-web來實現的
          1. spring 常用的注入方式
          2. spring 中的 bean 是線程安全的嗎
            不是
          3. spring 支持幾種 bean 的作用域
          4. Bean的生命周期
          5. spring 自動裝配 bean 有哪些方式
          6. spring 事務實現方式有哪些
            (1)編碼方式
            (2)spring配置方式
            (3)注解式——在業務方法上加@Transaction注解,將事務規則應用到業務邏輯中
          7. spring 的事務隔離
          • DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別
          • 未提交讀(read uncommited) :臟讀,不可重復讀,虛讀都有可能發生
          • 已提交讀 (read commited):避免臟讀。但是不可重復讀和虛讀有可能發生
          • 可重復讀 (repeatable read) :避免臟讀和不可重復讀.但是虛讀有可能發生.
          • 串行化的 (serializable) :避免以上所有讀問題.Mysql 默認:可重復讀
            Oracle 默認:已提交讀臟讀:一個事務讀取了另一個事務改寫但還未提交的數據,如果這些數據被回滾,則讀到的數據是無效的。未確認的相關性
            不可重復讀:在同一事務中,多次讀取同一數據返回的結果有所不同,讀到了之前的數據后又讀到了其他事務已經提交的更新的數據。不一致的分析
            幻讀(虛讀):一個事務讀取了幾行記錄后,另一個事務插入(insert)一些記錄幻讀就發生了。再后來的查詢中,第一個事務就會發現有些原來沒有的記錄。丟失或覆蓋更新
          1. Spring 事務的傳播屬性
            (1)REQUIRED(默認模式):業務方法需要在一個容器里運行。如果方法運行時,已經處在一個事務中,那么加入到這個事務,否則自己新建一個新的事務。
            (2)NOT_SUPPORTED:聲明方法不需要事務。如果方法沒有關聯到一個事務,容器不會為他開啟事務,如果方法在一個事務中被調用,該事務會被掛起,調用結束后,原先的事務會恢復執行。
            (3)REQUIRESNEW:不管是否存在事務,該方法總匯為自己發起一個新的事務。如果方法已經運行在一個事務中,則原有事務掛起,新的事務被創建。
            (4) MANDATORY:該方法只能在一個已經存在的事務中執行,業務方法不能發起自己的事務。如果在沒有事務的環境下被調用,容器拋出例外。
            (5)SUPPORTS:該方法在某個事務范圍內被調用,則方法成為該事務的一部分。如果方法在該事務范圍外被調用,該方法就在沒有事務的環境下執行。
            (6)NEVER:該方法絕對不能在事務范圍內執行。如果在就拋例外。只有該方法沒有關聯到任何事務,才正常執行。
            (7)NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中。如果沒有活動事務,則按REQUIRED屬性執行。它使用了一個單獨的事務,這個事務擁有多個可以回滾的保存點。內部事務的回滾不會對外部事務造成影響。它只對DataSourceTransactionManager事務管理器起效。
          2. Spring 怎么配置事務
            參考上面第10個問題
          3. @Transitional事務注解失效的情況

          @Transitional使用特性:
          1、service類標簽(一般不建議在接口上)上添加@Transactional,可以將整個類納入spring事務管理,在每個業務方法執行時都會開啟一個事務,不過這些事務采用相同的管理方式。
          2、@Transactional 注解只能應用到 public 可見度的方法上。 如果應用在protected、private或者 package可見度的方法上,也不會報錯,不過事務設置不會起作用。
          3、默認情況下,Spring會對運行時異常進行事務回滾;如果是檢查時異常則不回滾

          @Transactional注解事務失效的七種原因分析https://blog.csdn.net/csdn_wyl2016/article/details/106767583

          1. Spring 如何解決循環依賴,屬性注入和構造器注入哪種會有循環依賴的問題
            Spring中循環依賴場景有:
            (1)構造器的循環依賴
            (2)field屬性的循環依賴
            不要使用基于構造函數的依賴注入,可以通過以下方式解決:
            (1) 在字段上使用@Autowired注解,讓Spring決定在合適的時機注入
            (2) 用基于setter方法的依賴注入。
            Spring解決循環依賴的方法原理——getSingleton(…)方法,使用三級緩存,在bean初始化時解決循環依賴問題 https://blog.csdn.net/lkforce/article/details/97183065?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control 三級緩存分別指:
            singletonFactories : 單例對象工廠的cache
            earlySingletonObjects :提前暴光的單例對象的Cache
            singletonObjects:單例對象的cache
            在創建bean的時候,首先想到的是從cache中獲取這個單例的bean,這個緩存就是singletonObjects。如果獲取不到,并且對象正在創建中,就再從二級緩存earlySingletonObjects中獲取。如果還是獲取不到且允許singletonFactories通過getObject()獲取,就從三級緩存singletonFactory.getObject()(三級緩存)獲取,如果獲取到了則:從singletonFactories中移除,并放入earlySingletonObjects中。其實也就是從三級緩存移動到了二級緩存。
          2. BeanFactory和ApplicationContext有什么區別
          • BeanFactory定義和特點:是Spring里面最低層的接口,提供了最簡單的容器的功能,只提供了實例化對象和拿對象的功能。
          • ApplicationContext定義和特點:應用上下文,繼承BeanFactory接口,它是Spring的一各更高級的容器,提供了更多的有用的功能:
            1)國際化(MessageSource)
            2)訪問資源,如URL和文件(ResourceLoader)
            3)載入多個(有繼承關系)上下文 ,使得每一個上下文都專注于一個特定的層次,比如應用的web層
            4)消息發送、響應機制(ApplicationEventPublisher)
            5)AOP(攔截器)二者裝載bean的區別BeanFactory:BeanFactory在啟動的時候不會去實例化Bean,中有從容器中拿Bean的時候才會去實例化;ApplicationContext:ApplicationContext在啟動的時候就把所有的Bean全部實例化了。它還可以為Bean配置lazy-init=true來讓Bean延遲實例化;
          1. spring 的 controller 是單例還是多例,怎么保證并發的安全。
            單例
            單例是不安全的,會導致屬性重復使用(多個接口對同一個公有變量進行操作)
            解決方案
            1)不要在controller中定義成員變量。
            2)萬一必須要定義一個非靜態成員變量時候,則通過注解@Scope(“prototype”),將其設置為多例模式。
            3)在Controller中使用ThreadLocal變量
            spring的controller是單例還是多例,怎么保證并發的安全

          https://blog.csdn.net/riemann_/article/details/97698560

          SpringMVC

          1. spring mvc 運行流程
            1)springmvc請所有的請求都提交給DispatcherServlet, 它會委托應用系統的其他模塊負責負責對請求進行真正的處理工作。
            2)DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.
            3)DispatcherServlet將請求提交到目標Controller
            4)Controller進行業務邏輯處理后,會返回一個ModelAndView
            5)Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象
            6)視圖對象負責渲染返回給客戶端。
          2. spring mvc 有哪些組件
          • 前端控制器(DispatcherServlet):主要負責捕獲來自客戶端的請求和調度各個組件。
          • 處理器映射器(HandlerMapping):根據url查找后端控制器Handler。
          • 處理器適配器(HandlerAdapter):執行后端控制器(Handler),拿到后端控制器返回的結果ModelAndView后將結果返回給前端控制器DispatcherServlet。
          • 后端控制器(處理器)(Handler):通常指Controller,主要負責處理前端請求,完成業務邏輯,生成ModelAndView對象返回給HandlerAdapter。
          • 視圖解析器(ViewResolver):主要負責將從DispatcherServlet中拿到的ModelAndView對象進行解析,生成View對象返回給DispatcherServlet。
          • 視圖組件(View)
          • 攔截器組件(HandlerInterceptor)
          • 數據轉換組件(DataBinder)
          • 消息轉換器組件(HttpMessageConverter)
          1. @RequestMapping 的作用
            用來標識 http 請求地址與 Controller 類的方法之間的映射
          2. @Autowired 的作用
            @Autowired可以對類成員變量、方法及構造函數進行標注,讓 spring 完成 bean 自動裝配的工作【spring可以自動幫你把bean里面引用的對象的setter/getter方法省略,自動幫你set/get】

          Mybatis

          1. mybatis 中 #{}和 ${}的區別是什么?


          #{}是占位符,通過預編譯處理;${}是拼接符,通過字符串替換,非預編譯處理。 #{}可以放置SQL注入攻擊;${}不能防止SQL注入攻擊 Mybatis會將SQL中的#{}替換為?,并通過PreparedStatement的set方法進行賦值;但Mybatis會直接將${}替換為變量的值,相當于使用的是Statement方式進行編譯

          1. mybatis 有幾種分頁方式?
            答案1:
            分頁方式:邏輯分頁和物理分頁。邏輯分頁: 使用 MyBatis 自帶的 RowBounds 進行分頁,它是一次性查詢很多數據,然后在數據中再進行檢索。RowBounds在處理分頁時,只是簡單的把offset之前的數據都skip掉,超過limit之后的數據不取出
            物理分頁: 自己手寫 SQL 分頁或使用分頁插件 PageHelper,去數據庫查詢指定條數的分頁數據的形式。 jie答案2:數組分頁、sql分頁、攔截器,RowBounds分頁
            Mybatis分頁方式https://blog.csdn.net/chenbaige/article/details/70846902
          2. RowBounds 是一次性查詢全部結果嗎?為什么?
            RowBounds 表面是在“所有”數據中檢索數據,其實并非是一次性查詢出所有數據,因為 MyBatis 是對 jdbc 的封裝,在 jdbc 驅動中有一個 Fetch Size 的配置,它規定了每次最多從數據庫查詢多少條數據,假如你要查詢更多數據,它會在你執行 next()的時候,去查詢更多的數據。這樣做的好處可以有效的防止內存溢出
          3. mybatis 邏輯分頁和物理分頁的區別是什么?
          • 邏輯分頁是一次性查詢很多數據,然后再在結果中檢索分頁的數據。這樣做弊端是需要消耗大量的內存、有內存溢出的風險、對數據庫壓力較大。
          • 物理分頁是從數據庫查詢指定條數的數據,彌補了一次性全部查出的所有數據的種種缺點,比如需要大量的內存,對數據庫查詢壓力較大等問題。
          1. mybatis 是否支持延遲加載?延遲加載的原理是什么?
            MyBatis 支持延遲加載,設置 lazyLoadingEnabled=true 即可。
            延遲加載的原理的是調用的時候觸發加載,而不是在初始化的時候就加載信息
          2. 說一下 mybatis 的一級緩存和二級緩存?
          • 一級緩存:基于 PerpetualCache 的 HashMap 本地緩存,它的聲明周期是和 SQLSession 一致的,有多個 SQLSession 或者分布式的環境中數據庫操作,可能會出現臟數據。當 Session flush 或 close 之后,該 Session 中的所有 Cache 就將清空,默認一級緩存是開啟的。
          • 二級緩存:也是基于 PerpetualCache 的 HashMap 本地緩存,不同在于其存儲作用域為 Mapper 級別的,如果多個SQLSession之間需要共享緩存,則需要使用到二級緩存,并且二級緩存可自定義存儲源,如 Ehcache。默認不打開二級緩存,要開啟二級緩存,使用二級緩存屬性類需要實現 Serializable 序列化接口(可用來保存對象的狀態)。開啟二級緩存數據查詢流程:二級緩存 -> 一級緩存 -> 數據庫。緩存更新機制:當某一個作用域(一級緩存 Session/二級緩存 Mapper)進行了C/U/D 操作后,默認該作用域下所有 select 中的緩存將被 clear。
          1. mybatis 和 hibernate 的區別有哪些?
          • 靈活性:MyBatis 更加靈活,自己可以寫 SQL 語句,使用起來比較方便。
          • 可移植性:MyBatis 有很多自己寫的 SQL,因為每個數據庫的 SQL 可以不相同,所以可移植性比較差。
          • 學習和使用門檻:MyBatis 入門比較簡單,使用門檻也更低。
          • 二級緩存:hibernate 擁有更好的二級緩存,它的二級緩存可以自行更換為第三方的二級緩存
          1. mybatis 有哪些執行器(Executor)?
            SimpleExecutor、ReuseExecutor、BatchExecutor
            mybatis執行器詳解https://www.cnblogs.com/jxxblogs/p/12150432.html
          2. mybatis 分頁插件的實現原理是什么?
          3. mybatis 如何編寫一個自定義插件?

          SpringBoot

          1. 什么是 spring boot
            springboot就是Spring開源框架下的子項目,是Spring的一站式解決方案,主要是簡化了spring的使用難度,降低了對配置文件的要求,使得開發人員能夠更容易得上手
          2. 為什么要用 spring boot,SpringBoot比Spring做了哪些改進
            ? 簡化了Spring配置文件,
            ? 沒有代碼和XML文件的生成
            ? 內置TomCat
            ? 能夠獨立運行
            ? 簡化監控
          3. spring boot 核心配置文件有哪幾種類型?它們有什么區別
            Spring Boot 有兩種類型的配置文件,applicationbootstrap 文件
            Spring Boot會自動加載classpath目前下的這兩個文件,文件格式為 properties 或 yml 格式? .properties 文件是 key=value 的形式
            ? .yml 是 key: value 的形式。yml 加載的屬性是有順序的,但不支持 @PropertySource 注解來導入配置,一般推薦用yml文件,看下來更加形象◇ bootstrap 配置文件是系統級別的,用來加載外部配置,如配置中心的配置信息,也可以用來定義系統不會變化的屬性.bootstatp 文件的加載先于application文件
            ◇ application 配置文件是應用級別的,是當前應用的配置文件
          4. 如何理解 Spring Boot 中的 Starters, 其中加載原理
          • 常用Starters:
            ? spring-boot-starter
            這是Spring Boot的核心啟動器,包含了自動配置、日志和YAML。
            ? spring-boot-starter-aop
            支持面向方面的編程即AOP,包括spring-aop和AspectJ。
            ? spring-boot-starter-cache
            支持Spring的Cache抽象。
            ? spring-boot-starter-test
            支持常規的測試依賴,包括JUnit、Hamcrest、Mockito以及spring-test模塊。
            ? spring-boot-starter-thymeleaf
            支持Thymeleaf模板引擎,包括與Spring的集成。
            ? spring-boot-starter-web
            支持全棧式Web開發,包括Tomcat和spring-webmvc。
            ? spring-boot-starter-log4j
            支持Log4J日志框架。
            ? spring-boot-starter-tomcat
            引入了Spring Boot默認的HTTP引擎Tomcat。
          • 為什么springboot不用像spring一樣配置那么多文件?
            因為spring-boot-starter-actuator會自動掃描,生成需要的配置文件
          1. spring boot 有哪些方式可以實現熱部署
            實現熱部署方式https://www.cnblogs.com/jpfss/p/11977732.html

          SpringCloud

          1. 什么是 spring cloud
            微服務工具包,為開發者提供了在分布式系統的配置管理、服務發現、斷路器、智能路由、微代理、控制總線等開發工具包。
          2. spring cloud 斷路器的作用
            當一個服務調用另一個服務由于網絡原因或者自身原因出現問題時 調用者就會等待被調用者的響應 當更多的服務請求到這些資源時,導致更多的請求等待 這樣就會發生連鎖效應(雪崩效應)。斷路器就是解決這一問題。

          斷路器狀態:

          • 完全打開:一段時間內,達到一定的次數無法調用,并且多次監測沒有恢復的跡象,斷路器完全打開,那么下次請求就不會請求到該服務
          • 半開:短時間內,有恢復跡象,斷路器會將部分請求發給該服務,正常調用時,斷路器關閉
          • 關閉:當服務一直處于正常狀態,能正常調用
          1. spring cloud 的核心組件
            Eureka:服務注冊與發現。
            Feign:基于動態代理機制,根據注解和選擇的機器,拼接請求 url 地址,發起請求。
            Ribbon:實現負載均衡,從一個服務的多臺機器中選擇一臺。
            Hystrix:提供線程池,不同的服務走不同的線程池,實現了不同服務調用的隔離,避免了服務雪崩的問題。
            Zuul:網關管理,由Zuul 網關轉發請求給對應的服務。
            核心組件詳解https://blog.csdn.net/xunjiushi9717/article/details/91988479

          主站蜘蛛池模板: 性无码一区二区三区在线观看| 国产精品无码一区二区在线观一 | 亚洲精品一区二区三区四区乱码| 精品国产一区二区三区香蕉事| 国产伦一区二区三区高清 | 精品国产一区二区三区免费看| 亚洲AV美女一区二区三区| 一区二区三区免费视频观看 | 久久综合精品国产一区二区三区| 成人精品一区二区不卡视频| 无码人妻精品一区二区三区99性 | 自慰无码一区二区三区| 亚洲一区二区三区国产精品| 日韩精品久久一区二区三区 | 亚洲熟女乱综合一区二区| 国产一区二区三区电影| 国产人妖视频一区在线观看| 国产精品视频一区| 天堂va视频一区二区| 99偷拍视频精品一区二区| 免费无码A片一区二三区| 在线电影一区二区| 国产一区在线视频观看| 日韩精品无码久久一区二区三| 日本美女一区二区三区| 亚洲国产精品成人一区| 中文字幕精品无码一区二区| 激情内射亚州一区二区三区爱妻| 果冻传媒一区二区天美传媒| 国产在线精品一区二区三区直播| 国偷自产Av一区二区三区吞精| 中文字幕AV一区中文字幕天堂 | 无码中文人妻在线一区| 无码中文人妻在线一区 | 美女福利视频一区| 国内精品一区二区三区东京| 多人伦精品一区二区三区视频| 女同一区二区在线观看| 精品少妇一区二区三区在线| 亚洲欧洲一区二区| 无码人妻aⅴ一区二区三区有奶水|