日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring框架相关问题

發(fā)布時間:2023/12/4 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring框架相关问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1 Spring MVC 執(zhí)行流程
    • 2 Spring 框架中用到的設計模式
    • 3 Spring 事務、隔離級別
    • 4 @SpringBootApplication 做了哪些事
    • 5 Spring Boot 自動裝配原理
    • 6 Spring 容器:BeanFactory & ApplicationContext
    • 7 依賴注入的兩種方式
    • 8 單例 Bean 是線程安全的嗎
    • 9 AOP 通知的執(zhí)行順序
    • 10 依賴注入的四個注解

1 Spring MVC 執(zhí)行流程

  • 客戶端(瀏覽器)發(fā)送請求,直接請求到 DispatcherServlet。
  • DispatcherServlet 根據(jù)請求信息調用 HandlerMapping,解析請求對應的 Handler。
  • 解析到對應的 Handler(也就是 Controller)后,開始由 HandlerAdapter 適配器處理。
  • HandlerAdapter 會根據(jù) Handler 來調用真正的處理器開處理請求,并處理相應的業(yè)務邏輯。
  • 處理器處理完業(yè)務后,會返回一個 ModelAndView 對象,Model 是返回的數(shù)據(jù)對象,View 是邏輯上的視圖。
  • ViewResolver 會根據(jù)邏輯 View 查找實際的 View。
  • DispaterServlet 進行視圖渲染。
  • 把 View 返回給請求者(瀏覽器)。

  • 2 Spring 框架中用到的設計模式

    參考:Spring 中的設計模式

  • 工廠模式
    Spring 通過 BeanFactory、ApplicationContext 創(chuàng)建 Bean 對象
  • 單例模式
    Bean 默認都是單例的
  • 代理模式
    AOP 功能的實現(xiàn)基于代理模式
  • 模板模式
    xxxTemplate(例如 RestTemplate 等)使用了模板模式
  • 適配器模式
    Spring AOP 的增強或通知(Advice,例如 @ControllerAdvice)使用到了適配器模式;Spring MVC 中用到了適配器模式適配 Controller

  • 3 Spring 事務、隔離級別

    • 一般使用 @Transactional 注解方式實現(xiàn),只能應用到 public 方法上,否則不生效
    • 事務傳播:解決業(yè)務層方法之間互相調用的事務問題
    傳播行為解釋
    PROPAGATION_REQUIRED@Transactional注解默認使用。如果當前存在事務,則加入該事務(變成了同一事務,只要一個方法回滾,整個事務均回滾);如果當前沒有事務,則創(chuàng)建一個新的事務
    PROPAGATION_REQUIRES_NEW創(chuàng)建一個新的事務,如果當前存在事務,則把當前事務掛起。也就是說不管外部方法是否開啟事務,會新開啟自己的事務,且開啟的事務相互獨立,互不干擾
    PROPAGATION_NESTED如果當前存在事務,則創(chuàng)建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則等價于 PROPAGATION_REQUIRED
    PROPAGATION_MANDATORY如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常
    • 隔離級別:類似于 MySQL
    隔離級別解釋
    ISOLATION_DEFAULT默認的隔離級別,MySQL 默認采用的 REPEATABLE_READ 隔離級別,Oracle 默認采用的 READ_COMMITTED 隔離級別
    ISOLATION_READ_UNCOMMITTED允許讀取尚未提交的數(shù)據(jù)變更,可能會導致 臟讀、幻讀或不可重復讀
    ISOLATION_READ_COMMITTED允許讀取并發(fā)事務已提交的數(shù)據(jù),可以阻止臟讀,但是幻讀或不可重復讀仍有可能發(fā)生
    ISOLATION_REPEATABLE_READ對同一字段的多次讀取結果都是一致的,除非數(shù)據(jù)是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發(fā)生
    ISOLATION_SERIALIZABLE所有事務依次執(zhí)行,這樣事務之間就不可能產(chǎn)生干擾,可以防止臟讀、不可重復讀以及幻讀
    • @Transactional(rollbackFor = MyException.class) 注解
      如果類或者方法加了這個注解,那么這個類里面的方法拋出異常,就會回滾,數(shù)據(jù)庫里面的數(shù)據(jù)也會回滾

      在 @Transactional 注解中如果不配置 rollbackFor 屬性,那么事務只會在遇到 RuntimeException 的時候才會回滾,加上 rollbackFor=Exception.class ,可以讓事務在遇到自定義的非運行時異常時也回滾


    4 @SpringBootApplication 做了哪些事

    @SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan

    • @EnableAutoConfiguration:啟用 SpringBoot 的自動配置機制
    • @ComponentScan: 掃描被 @Component (@Service,@Controller) 注解的 bean,注解默認會掃描該類所在的包下所有的類
    • @Configuration:允許在 Spring 上下文中注冊額外的 bean 或導入其他配置類

    5 Spring Boot 自動裝配原理

    自動裝配可以簡單理解為:通過注解或者一些簡單的配置就能在 Spring Boot 的幫助下實現(xiàn)某塊功能

  • @SpringBootApplication -> @EnableAutoConfiguration -> AutoConfigurationImportSelector
  • AutoConfigurationImportSelector 實現(xiàn)了 ImportSelector 接口中的 selectImports 方法,該方法主要用于獲取所有符合條件的類的全限定類名(返回 String 數(shù)組,一系列的 “xxxAutoConfiguration”),這些類需要被加載到 IoC 容器中
  • private static final String[] NO_IMPORTS = new String[0];public String[] selectImports(AnnotationMetadata annotationMetadata) {// <1>.判斷自動裝配開關是否打開if (!this.isEnabled(annotationMetadata)) {return NO_IMPORTS;} else {//<2>.獲取所有需要裝配的beanAutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata); // 下圖詳細說明return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());} }

    下圖中的紅色字體“自動配置類名”即為 xxxAutoConfiguration 類

  • 所有 Spring Boot Starter 下的 META-INF/spring.factories 都會被讀取到。XXXAutoConfiguration 類的作用就是按需加載組件
  • 啟動應用時,不同的 Stater 的 spring.factories 的配置很多,每次啟動不會全部加載。只有自動配置類或其中的方法上的 @ConditionalOnXXX 中的所有條件都滿足才會生效
  • @Configuration // 檢查相關的類是否存在,存在才會加載 @ConditionalOnClass({EnableAspectJAutoProxy.class, Aspect.class, Advice.class, AnnotatedElement.class}) @ConditionalOnProperty(prefix = "spring.aop", name = {"auto"}, havingValue = "true", matchIfMissing = true) public class AopAutoConfiguration {// ...@Configuration@EnableAspectJAutoProxy(proxyTargetClass = true)@ConditionalOnProperty(prefix = "spring.aop", name = {"proxy-target-class"}, havingValue = "true", matchIfMissing = true)public static class CglibAutoProxyConfiguration {public CglibAutoProxyConfiguration() {}}// ... }

    6 Spring 容器:BeanFactory & ApplicationContext

    • BeanFactory 和 ApplicationContext 是 Spring 的兩大核心接口,都可以當做 Spring 的容器, ApplicationContext 是BeanFactory 的子接口

    • BeanFactroy 采用的是 延遲加載 形式來注入 Bean 的,即只有在使用到某個 Bean 時(調用getBean()),才對該 Bean 進行實例化

      • 這樣導致不能發(fā)現(xiàn)一些存在的 Spring 的配置問題:如果Bean的某一個屬性沒有注入,BeanFacotry 加載后,直至第一次使用調用 getBean 方法才會拋出異常
      • 是一種低級的容器,類似于一個 HashMap,Key 是 BeanName,Value 是 Bean 實例,通常只提供注冊(put),獲取(get)這兩個功能
    • ApplicationContext 在容器啟動時,一次性創(chuàng)建了所有的 Bean(把創(chuàng)建資源的過程放在服務器啟動時)。這樣在容器啟動時就可以發(fā)現(xiàn) Spring 中存在的配置錯誤,這樣有利于檢查所依賴屬性是否注入。 ApplicationContext 啟動后預載入所有的單實例Bean,通過預載入單實例 Bean,確保當需要的時候就不用等待


    7 依賴注入的兩種方式

  • 使用 setter 方法
    - 容器通過調用無參構造器或無參static工廠方法實例化 Bean 之后,調用該 Bean 的 setter 方法
    - 用于實現(xiàn)可選依賴,適合設置少量屬性

  • 使用有參構造器
    - 構造器依賴注入通過容器觸發(fā)一個類的構造器來實現(xiàn)的
    - 用于實現(xiàn)強制依賴,適合設置大量屬性


  • 8 單例 Bean 是線程安全的嗎

    • 不是,Spring 框架并沒有對單例 Bean 進行多線程的封裝處理
    • 大部分時候 Bean 是無狀態(tài)的(比如 dao ,無狀態(tài)即不會保存數(shù)據(jù)),所以大部分 Bean 是線程安全的
    • 如果 Bean 有狀態(tài)的話,需要開發(fā)者保證線程安全,最簡單的就是改變 Bean 的作用域,把 singleton 變更為 prototype ,這樣請求 Bean 相當于 new Bean(),就可以保證線程安全了

    9 AOP 通知的執(zhí)行順序

    @Component(value = "enhanceClass") @Aspect public class EnhanceClass {@Before(value = "execution(* pojo.MyClass.add(..))")public void before() {System.out.println("前置通知");}@AfterReturning(value = "execution(* pojo.MyClass.add(..))")public void afterReturning() {System.out.println("后置通知,正常返回時才執(zhí)行");}@After(value = "execution(* pojo.MyClass.add(..))")public void after() {System.out.println("最終通知,無論是否正常返回都執(zhí)行");}@AfterThrowing(value = "execution(* pojo.MyClass.add(..))")public void afterThrowing() {System.out.println("異常通知");}@Around(value = "execution(* pojo.MyClass.add(..))")public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("環(huán)繞通知:前");proceedingJoinPoint.proceed();System.out.println("環(huán)繞通知:后");} }- 無異常時: 1. around before advice 2. before advice 3. target method 4. around after advice 5. after advice 6. afterReturning advice- 有異常時: 1. around before advice 2. before advice 3. target method 執(zhí)行 4. around after advice 5. after advice 6. afterThrowing advice 7. 異常發(fā)生

    10 依賴注入的四個注解

    注解作用范圍
    @Autowired按類型自動裝配構造方法、成員變量、Setter 方法
    @Qualifier按名稱自動裝配,需要和 @Autowired 搭配使用成員變量、Setter 方法
    @Resource按名稱或類型自動裝配;未指定規(guī)則時,默認先按名稱裝配,找不到滿足要求的 bean,再按類型裝配成員變量、Setter 方法
    @Value注入 int / float / String 等基本數(shù)據(jù)類型成員變量、Setter 方法

    總結

    以上是生活随笔為你收集整理的Spring框架相关问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。