最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring事務(wù)管理@Transactional注解最佳實(shí)踐

 更新時(shí)間:2026年02月24日 09:28:31   作者:寒人病酒  
本文詳細(xì)介紹了Spring框架的核心特性,包括IOC容器、AOP面向切面編程和事務(wù)管理,重點(diǎn)解析了Spring事務(wù)的傳播行為和隔離級(jí)別,以及SpringBoot的自動(dòng)配置原理,本文給大家講解的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

Spring事務(wù)管理:@Transactional注解深度解析

Spring框架是Java后端開發(fā)的核心技術(shù)棧,掌握其原理和最佳實(shí)踐至關(guān)重要。

一、Spring核心特性

事務(wù)管理是企業(yè)級(jí)應(yīng)用的核心功能,理解Spring事務(wù)的傳播行為和隔離級(jí)別對(duì)保證數(shù)據(jù)一致性至關(guān)重要

二、IOC容器

2.1 Bean的生命周期

Spring Bean 生命周期流程:

實(shí)例化
  ↓
屬性賦值 (populateBean)
  ↓
BeanNameAware (setBeanName)
  ↓
BeanFactoryAware (setBeanFactory)
  ↓
ApplicationContextAware (setApplicationContext)
  ↓
BeanPostProcessor前置 (postProcessBeforeInitialization)
  ↓
InitializingBean (afterPropertiesSet)
  ↓
init-method (自定義初始化方法)
  ↓
BeanPostProcessor后置 (postProcessAfterInitialization)
  ↓
使用Bean (ready for use)
  ↓
DisposableBean (destroy)
  ↓
destroy-method (自定義銷毀方法)

說(shuō)明:
- 藍(lán)色節(jié)點(diǎn):Spring 提供的擴(kuò)展接口
- 綠色節(jié)點(diǎn):用戶自定義的方法

2.2 依賴注入方式

// 1. 構(gòu)造器注入(推薦)
@Component
public class UserService {
    private final UserRepository userRepository;
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
// 2. Setter注入
@Component
public class UserService {
    private UserRepository userRepository;
    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
// 3. 字段注入(不推薦)
@Component
public class UserService {
    @Autowired
    private UserRepository userRepository;
}

三、AOP面向切面編程

3.1 AOP核心概念

  • 切面(Aspect):橫切關(guān)注點(diǎn)的模塊化
  • 連接點(diǎn)(JoinPoint):程序執(zhí)行的某個(gè)位置
  • 切點(diǎn)(Pointcut):匹配連接點(diǎn)的表達(dá)式
  • 通知(Advice):在切點(diǎn)上執(zhí)行的動(dòng)作
  • 目標(biāo)對(duì)象(Target):被代理的對(duì)象

3.2 通知類型

@Aspect
@Component
public class LoggingAspect {
    // 前置通知
    @Before("execution(* com.example.service.*.*(..))")
    public void beforeMethod(JoinPoint joinPoint) {
        System.out.println("Before: " + joinPoint.getSignature());
    }
    // 后置通知
    @After("execution(* com.example.service.*.*(..))")
    public void afterMethod(JoinPoint joinPoint) {
        System.out.println("After: " + joinPoint.getSignature());
    }
    // 返回通知
    @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))",
                     returning = "result")
    public void afterReturning(JoinPoint joinPoint, Object result) {
        System.out.println("AfterReturning: " + result);
    }
    // 異常通知
    @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))",
                   throwing = "ex")
    public void afterThrowing(JoinPoint joinPoint, Exception ex) {
        System.out.println("AfterThrowing: " + ex.getMessage());
    }
    // 環(huán)繞通知
    @Around("execution(* com.example.service.*.*(..))")
    public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Around Before");
        Object result = joinPoint.proceed();
        System.out.println("Around After");
        return result;
    }
}

四、Spring事務(wù)管理

4.1 事務(wù)注解

@Service
public class OrderService {
    // 聲明式事務(wù)
    @Transactional(
        propagation = Propagation.REQUIRED,  // 傳播行為
        isolation = Isolation.READ_COMMITTED,  // 隔離級(jí)別
        timeout = 30,  // 超時(shí)時(shí)間
        readOnly = false,  // 只讀
        rollbackFor = Exception.class  // 回滾異常
    )
    public void createOrder(Order order) {
        // 業(yè)務(wù)邏輯
    }
}

4.2 事務(wù)傳播行為

傳播行為說(shuō)明
REQUIRED默認(rèn),如果存在事務(wù)則加入,否則新建
REQUIRES_NEW新建事務(wù),掛起當(dāng)前事務(wù)
SUPPORTS如果存在事務(wù)則加入,否則非事務(wù)執(zhí)行
NOT_SUPPORTED非事務(wù)執(zhí)行,掛起當(dāng)前事務(wù)
MANDATORY必須在事務(wù)中,否則拋異常
NEVER必須非事務(wù)執(zhí)行,否則拋異常
NESTED嵌套事務(wù),回滾點(diǎn)保存

五、Spring Boot自動(dòng)配置

5.1 自動(dòng)配置原理

// @EnableAutoConfiguration 注解
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    String[] excludeName() default {};
}
// 自動(dòng)配置類示例
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(DataSource.class)
@ConditionalOnProperty(prefix = "spring.datasource", name = "url")
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
    // 配置邏輯
}

5.2 常用注解

// 條件注解
@ConditionalOnClass        // 類路徑下存在指定類
@ConditionalOnMissingClass  // 類路徑下不存在指定類
@ConditionalOnBean         // 容器中存在指定Bean
@ConditionalOnMissingBean   // 容器中不存在指定Bean
@ConditionalOnProperty      // 配置屬性滿足條件
@ConditionalOnWebApplication  // Web環(huán)境

六、常見面試題

Q1: Spring中循環(huán)依賴如何解決?

答案:
Spring通過(guò)三級(jí)緩存解決循環(huán)依賴:

// 三級(jí)緩存
1. singletonObjects          // 一級(jí)緩存:完整的Bean
2. earlySingletonObjects     // 二級(jí)緩存:提前暴露的Bean
3. singletonFactories        // 三級(jí)緩存:Bean的工廠
// 解決流程
1. A實(shí)例化后,放入三級(jí)緩存
2. A注入B,B需要A
3. B從三級(jí)緩存獲取A的工廠,創(chuàng)建A的代理對(duì)象
4. B注入A的代理對(duì)象,B完成初始化
5. A繼續(xù)初始化,注入B,完成初始化

Q2: @Autowired和@Resource的區(qū)別?

答案:

特性@Autowired@Resource
來(lái)源SpringJava JSR-250
匹配方式按類型,其次按名稱按名稱,其次按類型
Required屬性支持不支持
作用位置構(gòu)造器、方法、字段方法、字段

Q3: 事務(wù)失效的場(chǎng)景有哪些?

答案:
1. 方法不是public
2. 方法自調(diào)用(this調(diào)用)
3. 異常被捕獲未拋出
4. 異常類型不匹配(默認(rèn)RuntimeException)
5. 數(shù)據(jù)庫(kù)引擎不支持事務(wù)
6. 未被Spring管理(無(wú)@Component等注解)

七、最佳實(shí)踐

代碼規(guī)范:
- 優(yōu)先使用構(gòu)造器注入
- 合理使用AOP,避免過(guò)度設(shè)計(jì)
- 事務(wù)粒度要小,避免大事務(wù)

性能優(yōu)化:
- 使用循環(huán)依賴緩存
- 合理使用懶加載(@Lazy)
- 控制Bean的生命周期

八、總結(jié)

Spring框架博大精深,持續(xù)學(xué)習(xí):

? 核心要點(diǎn)
- 掌握IOC和AOP原理
- 理解事務(wù)傳播機(jī)制
- 熟悉自動(dòng)配置原理

進(jìn)階方向
- 閱讀Spring源碼
- 學(xué)習(xí)Spring Cloud微服務(wù)
- 實(shí)踐項(xiàng)目應(yīng)用

推薦資源
- 《Spring實(shí)戰(zhàn)》
- Spring官方文檔
- Spring源碼分析

到此這篇關(guān)于Spring事務(wù)管理@Transactional注解最佳實(shí)踐的文章就介紹到這了,更多相關(guān)Spring事務(wù)管理@Transactional注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java對(duì)指定目錄下文件讀寫操作介紹

    java對(duì)指定目錄下文件讀寫操作介紹

    本文將詳細(xì)介紹java對(duì)指定目錄下文件的讀寫功能實(shí)現(xiàn),需要的朋友可以參考下
    2012-11-11
  • MyBatis傳入多個(gè)參數(shù)時(shí)parameterType的寫法

    MyBatis傳入多個(gè)參數(shù)時(shí)parameterType的寫法

    這篇文章主要介紹了MyBatis傳入多個(gè)參數(shù)時(shí)parameterType的寫法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • springboot與mybatis整合實(shí)例詳解(完美融合)

    springboot與mybatis整合實(shí)例詳解(完美融合)

    大家都知道springboot搭建一個(gè)spring框架只需要秒秒鐘。下面通過(guò)實(shí)例代碼給大家介紹一下springboot與mybatis的完美融合,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-09-09
  • Java實(shí)現(xiàn)走迷宮回溯算法

    Java實(shí)現(xiàn)走迷宮回溯算法

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)走迷宮回溯算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • SpringBoot超詳細(xì)講解@Value注解

    SpringBoot超詳細(xì)講解@Value注解

    在使用spring框架的項(xiàng)目中,@Value是經(jīng)常使用的注解之一。作用是將配置文件中的鍵對(duì)應(yīng)的值分配給某類內(nèi)帶注解的屬性。本文使您系統(tǒng)地了解@Value的用法。在使用Spring框架的項(xiàng)目中@Value是經(jīng)常使用的注解之一,其作用是將配置文件中的鍵對(duì)應(yīng)的值分配給某類內(nèi)帶注解的屬性
    2022-07-07
  • Java詳細(xì)分析梳理垃圾回收機(jī)制

    Java詳細(xì)分析梳理垃圾回收機(jī)制

    垃圾回收,顧名思義,便是將已經(jīng)分配出去的,但卻不再使用的內(nèi)存回收回來(lái),以便能夠再次分配。在?Java?虛擬機(jī)的語(yǔ)境下,垃圾指的是死亡的對(duì)象所占據(jù)的堆空間
    2022-04-04
  • Java報(bào)錯(cuò):java.util.concurrent.ExecutionException的解決辦法

    Java報(bào)錯(cuò):java.util.concurrent.ExecutionException的解決辦法

    在Java并發(fā)編程中,我們經(jīng)常使用java.util.concurrent包提供的工具來(lái)管理和協(xié)調(diào)多個(gè)線程的執(zhí)行,va并發(fā)編程中,然而,在使用這些工具時(shí),可能會(huì)遇到各種各樣的異常,其中之一就是java.util.concurrent.ExecutionException,本文將詳細(xì)分析這種異常的背景、可能的原因
    2024-09-09
  • 創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過(guò)程解析

    創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過(guò)程解析

    這篇文章主要介紹了創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 一文讓你徹底學(xué)會(huì)Java左移、右移操作

    一文讓你徹底學(xué)會(huì)Java左移、右移操作

    這篇文章主要介紹了了Java中的位運(yùn)算符,包括左移(<<)、右移(>>)和無(wú)符號(hào)右移(>>>),左移將數(shù)字的二進(jìn)制位向左移動(dòng),相當(dāng)于乘以2的n次方;右移將數(shù)字的二進(jìn)制位向右移動(dòng),保留符號(hào)位,相當(dāng)于除以2的n次方,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • elasticsearch+logstash并使用java代碼實(shí)現(xiàn)日志檢索

    elasticsearch+logstash并使用java代碼實(shí)現(xiàn)日志檢索

    這篇文章主要介紹了elasticsearch+logstash并使用java代碼實(shí)現(xiàn)日志檢索,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02

最新評(píng)論

綦江县| 镇坪县| 张掖市| 潞西市| 洪洞县| 怀安县| 鄂温| 桃江县| 闽侯县| 德保县| 新密市| 北宁市| 玉龙| 渭源县| 温宿县| 城市| 施甸县| 宜春市| 虞城县| 车致| 平塘县| 扬州市| 巴马| 隆昌县| 敖汉旗| 九龙县| 无极县| 乐陵市| 兴海县| 古蔺县| 白沙| 磐石市| 中山市| 商洛市| 运城市| 寿光市| 日喀则市| 遂川县| 云安县| 正安县| 横山县|