javascript
Spring框架相关问题
文章目錄
- 1 Spring MVC 執行流程
 - 2 Spring 框架中用到的設計模式
 - 3 Spring 事務、隔離級別
 - 4 @SpringBootApplication 做了哪些事
 - 5 Spring Boot 自動裝配原理
 - 6 Spring 容器:BeanFactory & ApplicationContext
 - 7 依賴注入的兩種方式
 - 8 單例 Bean 是線程安全的嗎
 - 9 AOP 通知的執行順序
 - 10 依賴注入的四個注解
 
1 Spring MVC 執行流程
2 Spring 框架中用到的設計模式
參考:Spring 中的設計模式
Spring 通過 BeanFactory、ApplicationContext 創建 Bean 對象
Bean 默認都是單例的
AOP 功能的實現基于代理模式
xxxTemplate(例如 RestTemplate 等)使用了模板模式
Spring AOP 的增強或通知(Advice,例如 @ControllerAdvice)使用到了適配器模式;Spring MVC 中用到了適配器模式適配 Controller
3 Spring 事務、隔離級別
- 一般使用 @Transactional 注解方式實現,只能應用到 public 方法上,否則不生效
 - 事務傳播:解決業務層方法之間互相調用的事務問題
 
| PROPAGATION_REQUIRED | @Transactional注解默認使用。如果當前存在事務,則加入該事務(變成了同一事務,只要一個方法回滾,整個事務均回滾);如果當前沒有事務,則創建一個新的事務 | 
| PROPAGATION_REQUIRES_NEW | 創建一個新的事務,如果當前存在事務,則把當前事務掛起。也就是說不管外部方法是否開啟事務,會新開啟自己的事務,且開啟的事務相互獨立,互不干擾 | 
| PROPAGATION_NESTED | 如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則等價于 PROPAGATION_REQUIRED | 
| PROPAGATION_MANDATORY | 如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常 | 
- 隔離級別:類似于 MySQL
 
| ISOLATION_DEFAULT | 默認的隔離級別,MySQL 默認采用的 REPEATABLE_READ 隔離級別,Oracle 默認采用的 READ_COMMITTED 隔離級別 | 
| ISOLATION_READ_UNCOMMITTED | 允許讀取尚未提交的數據變更,可能會導致 臟讀、幻讀或不可重復讀 | 
| ISOLATION_READ_COMMITTED | 允許讀取并發事務已提交的數據,可以阻止臟讀,但是幻讀或不可重復讀仍有可能發生 | 
| ISOLATION_REPEATABLE_READ | 對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發生 | 
| ISOLATION_SERIALIZABLE | 所有事務依次執行,這樣事務之間就不可能產生干擾,可以防止臟讀、不可重復讀以及幻讀 | 
-  
@Transactional(rollbackFor = MyException.class) 注解
如果類或者方法加了這個注解,那么這個類里面的方法拋出異常,就會回滾,數據庫里面的數據也會回滾在 @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 的幫助下實現某塊功能
下圖中的紅色字體“自動配置類名”即為 xxxAutoConfiguration 類
 
6 Spring 容器:BeanFactory & ApplicationContext
-  
BeanFactory 和 ApplicationContext 是 Spring 的兩大核心接口,都可以當做 Spring 的容器, ApplicationContext 是BeanFactory 的子接口
 -  
BeanFactroy 采用的是 延遲加載 形式來注入 Bean 的,即只有在使用到某個 Bean 時(調用getBean()),才對該 Bean 進行實例化
- 這樣導致不能發現一些存在的 Spring 的配置問題:如果Bean的某一個屬性沒有注入,BeanFacotry 加載后,直至第一次使用調用 getBean 方法才會拋出異常
 - 是一種低級的容器,類似于一個 HashMap,Key 是 BeanName,Value 是 Bean 實例,通常只提供注冊(put),獲取(get)這兩個功能
 
 -  
ApplicationContext 在容器啟動時,一次性創建了所有的 Bean(把創建資源的過程放在服務器啟動時)。這樣在容器啟動時就可以發現 Spring 中存在的配置錯誤,這樣有利于檢查所依賴屬性是否注入。 ApplicationContext 啟動后預載入所有的單實例Bean,通過預載入單實例 Bean,確保當需要的時候就不用等待
 
7 依賴注入的兩種方式
使用 setter 方法
 - 容器通過調用無參構造器或無參static工廠方法實例化 Bean 之后,調用該 Bean 的 setter 方法
 - 用于實現可選依賴,適合設置少量屬性
使用有參構造器
 - 構造器依賴注入通過容器觸發一個類的構造器來實現的
 - 用于實現強制依賴,適合設置大量屬性
8 單例 Bean 是線程安全的嗎
- 不是,Spring 框架并沒有對單例 Bean 進行多線程的封裝處理
 - 大部分時候 Bean 是無狀態的(比如 dao ,無狀態即不會保存數據),所以大部分 Bean 是線程安全的
 - 如果 Bean 有狀態的話,需要開發者保證線程安全,最簡單的就是改變 Bean 的作用域,把 singleton 變更為 prototype ,這樣請求 Bean 相當于 new Bean(),就可以保證線程安全了
 
9 AOP 通知的執行順序
@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("后置通知,正常返回時才執行");}@After(value = "execution(* pojo.MyClass.add(..))")public void after() {System.out.println("最終通知,無論是否正常返回都執行");}@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("環繞通知:前");proceedingJoinPoint.proceed();System.out.println("環繞通知:后");} }- 無異常時: 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 執行 4. around after advice 5. after advice 6. afterThrowing advice 7. 異常發生10 依賴注入的四個注解
| @Autowired | 按類型自動裝配 | 構造方法、成員變量、Setter 方法 | 
| @Qualifier | 按名稱自動裝配,需要和 @Autowired 搭配使用 | 成員變量、Setter 方法 | 
| @Resource | 按名稱或類型自動裝配;未指定規則時,默認先按名稱裝配,找不到滿足要求的 bean,再按類型裝配 | 成員變量、Setter 方法 | 
| @Value | 注入 int / float / String 等基本數據類型 | 成員變量、Setter 方法 | 
總結
以上是生活随笔為你收集整理的Spring框架相关问题的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 我选了一款带鱼屏游戏显示器我选了一款带鱼
 - 下一篇: PyTorch深度学习实践