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

Spring事務(wù)注解@Transactional參數(shù)詳解與實(shí)戰(zhàn)示例

 更新時間:2025年12月29日 11:57:48   作者:海南java第二人  
本文詳細(xì)介紹了Spring框架中@Transactional注解的各個核心參數(shù),包括傳播行為、隔離級別、超時設(shè)置、只讀事務(wù)、回滾規(guī)則和事務(wù)管理器等,通過理論講解和實(shí)戰(zhàn)示例,幫助開發(fā)者全面掌握這些參數(shù)的使用,提升應(yīng)用的數(shù)據(jù)一致性和系統(tǒng)可靠性,感興趣的朋友跟隨小編一起看看吧

一、前言:為什么需要深入了解事務(wù)注解參數(shù)?

在Spring框架的應(yīng)用開發(fā)中,事務(wù)管理是確保數(shù)據(jù)一致性和完整性的關(guān)鍵環(huán)節(jié)。@Transactional注解作為聲明式事務(wù)管理的核心,極大地簡化了事務(wù)的配置和使用。然而,很多開發(fā)者僅僅停留在基礎(chǔ)使用層面,對其豐富的參數(shù)配置了解不足,導(dǎo)致在實(shí)際開發(fā)中遇到事務(wù)失效、性能問題或不符合業(yè)務(wù)需求的情況。

本文將深入剖析@Transactional注解的各個參數(shù),通過理論講解與實(shí)戰(zhàn)示例相結(jié)合的方式,幫助你全面掌握Spring事務(wù)控制的精髓,提升應(yīng)用的數(shù)據(jù)一致性和系統(tǒng)可靠性。

二、@Transactional注解核心參數(shù)全解

2.1 事務(wù)傳播行為(propagation)

傳播行為定義了事務(wù)方法被另一個事務(wù)方法調(diào)用時,事務(wù)應(yīng)該如何傳播。這是事務(wù)注解中最重要且最復(fù)雜的參數(shù)之一。

2.1.1 七種傳播行為詳解

public enum Propagation {
    /**
     * 支持當(dāng)前事務(wù),如果不存在則新建一個(默認(rèn)值)
     * 這是最常用的傳播行為
     */
    REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
    /**
     * 支持當(dāng)前事務(wù),如果不存在則以非事務(wù)方式執(zhí)行
     * 適用于不需要事務(wù)支持但可以參與現(xiàn)有事務(wù)的方法
     */
    SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
    /**
     * 支持當(dāng)前事務(wù),如果不存在則拋出異常
     * 強(qiáng)制要求必須在事務(wù)中調(diào)用
     */
    MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
    /**
     * 新建事務(wù),如果當(dāng)前存在事務(wù)則將其掛起
     * 適用于需要獨(dú)立事務(wù)的子操作
     */
    REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
    /**
     * 以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù)則將其掛起
     * 適用于不需要事務(wù)的只讀操作
     */
    NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
    /**
     * 以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù)則拋出異常
     * 強(qiáng)制要求不能在事務(wù)中調(diào)用
     */
    NEVER(TransactionDefinition.PROPAGATION_NEVER),
    /**
     * 如果當(dāng)前存在事務(wù),則在嵌套事務(wù)中執(zhí)行
     * 嵌套事務(wù)是外部事務(wù)的子事務(wù),可以獨(dú)立提交或回滾
     * 注意:并非所有數(shù)據(jù)源都支持嵌套事務(wù)
     */
    NESTED(TransactionDefinition.PROPAGATION_NESTED)
}

2.1.2 實(shí)戰(zhàn)場景分析

@Service
public class OrderService {
    @Autowired
    private InventoryService inventoryService;
    @Autowired
    private PaymentService paymentService;
    @Transactional(propagation = Propagation.REQUIRED)
    public void createOrder(OrderDTO order) {
        // 創(chuàng)建訂單記錄
        orderRepository.save(order);
        try {
            // 扣減庫存 - 需要獨(dú)立事務(wù),失敗不影響訂單創(chuàng)建
            inventoryService.deductInventory(order.getProductId(), order.getQuantity());
        } catch (Exception e) {
            // 庫存操作失敗,但訂單已創(chuàng)建,需要人工介入處理
            log.error("庫存扣減失敗,訂單號: {}", order.getOrderNo(), e);
        }
        // 支付處理 - 必須與訂單創(chuàng)建在同一個事務(wù)中
        paymentService.processPayment(order);
    }
}
@Service
class InventoryService {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void deductInventory(Long productId, Integer quantity) {
        // 獨(dú)立事務(wù)執(zhí)行庫存扣減
        inventoryRepository.reduceStock(productId, quantity);
        // 記錄庫存變更日志
        inventoryLogRepository.save(new InventoryLog(productId, quantity));
    }
}

2.2 事務(wù)隔離級別(isolation)

隔離級別定義了事務(wù)在并發(fā)環(huán)境中可能遇到的數(shù)據(jù)一致性問題。

2.2.1 四種隔離級別詳解

public enum Isolation {
    /**
     * 使用底層數(shù)據(jù)源的默認(rèn)隔離級別
     * MySQL默認(rèn)是REPEATABLE_READ,Oracle默認(rèn)是READ_COMMITTED
     */
    DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
    /**
     * 讀未提交 - 允許讀取未提交的數(shù)據(jù)變更
     * 可能出現(xiàn)臟讀、不可重復(fù)讀和幻讀
     * 性能最高,但數(shù)據(jù)一致性最差
     */
    READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
    /**
     * 讀已提交 - 只能讀取已提交的數(shù)據(jù)
     * 可以避免臟讀,但可能出現(xiàn)不可重復(fù)讀和幻讀
     * 大多數(shù)數(shù)據(jù)庫的默認(rèn)級別
     */
    READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
    /**
     * 可重復(fù)讀 - 同一事務(wù)中多次讀取結(jié)果一致
     * 可以避免臟讀和不可重復(fù)讀,但可能出現(xiàn)幻讀
     * MySQL的默認(rèn)級別(InnoDB通過MVCC避免了幻讀)
     */
    REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
    /**
     * 串行化 - 完全串行執(zhí)行事務(wù)
     * 可以避免所有并發(fā)問題,但性能最低
     * 適用于對數(shù)據(jù)一致性要求極高的場景
     */
    SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE)
}

2.2.2 隔離級別問題示例

@Service
public class AccountService {
    // 場景:銀行轉(zhuǎn)賬,需要最高級別的數(shù)據(jù)一致性
    @Transactional(
        isolation = Isolation.SERIALIZABLE,
        timeout = 30
    )
    public void transfer(TransferRequest request) {
        // 檢查賬戶余額(這里需要避免不可重復(fù)讀)
        BigDecimal balance = accountRepository.getBalance(request.getFromAccount());
        if (balance.compareTo(request.getAmount()) < 0) {
            throw new InsufficientBalanceException("余額不足");
        }
        // 扣減轉(zhuǎn)出賬戶金額
        accountRepository.deduct(request.getFromAccount(), request.getAmount());
        // 增加轉(zhuǎn)入賬戶金額
        accountRepository.add(request.getToAccount(), request.getAmount());
        // 記錄交易流水(需要避免幻讀)
        transactionRepository.save(createTransactionRecord(request));
    }
    // 場景:報表統(tǒng)計,對實(shí)時性要求不高但需要一致性視圖
    @Transactional(
        isolation = Isolation.REPEATABLE_READ,
        readOnly = true
    )
    public FinancialReport generateDailyReport(LocalDate date) {
        // 多次查詢需要保持?jǐn)?shù)據(jù)一致性
        BigDecimal totalIncome = orderRepository.sumIncomeByDate(date);
        BigDecimal totalExpense = expenseRepository.sumExpenseByDate(date);
        List<Transaction> transactions = transactionRepository.findByDate(date);
        return FinancialReport.builder()
                .date(date)
                .totalIncome(totalIncome)
                .totalExpense(totalExpense)
                .transactions(transactions)
                .build();
    }
}

2.3 超時設(shè)置(timeout)

超時參數(shù)定義了事務(wù)執(zhí)行的最長時間,超過該時間事務(wù)將自動回滾。

@Service
public class BatchProcessingService {
    // 批量數(shù)據(jù)處理,設(shè)置較長的超時時間
    @Transactional(
        timeout = 300,  // 5分鐘超時
        propagation = Propagation.REQUIRES_NEW
    )
    public void processLargeBatch(List<Data> dataList) {
        // 大數(shù)據(jù)量處理操作
        dataList.forEach(data -> {
            processItem(data);
            // 每處理100條記錄提交一次,避免長時間占用連接
            if (counter.get() % 100 == 0) {
                EntityManagerHelper.flushAndClear();
            }
        });
    }
    // 快速查詢操作,設(shè)置較短的超時時間
    @Transactional(
        timeout = 5,  // 5秒超時
        readOnly = true
    )
    public QuickResult quickSearch(SearchCriteria criteria) {
        return searchRepository.quickSearch(criteria);
    }
}

2.4 只讀事務(wù)(readOnly)

只讀事務(wù)優(yōu)化提示,幫助數(shù)據(jù)庫進(jìn)行性能優(yōu)化。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Transactional(readOnly = true)
    @Query("SELECT u FROM User u WHERE u.status = 'ACTIVE'")
    List<User> findAllActiveUsers();
    @Transactional(readOnly = true)
    @Query("SELECT new com.example.UserDTO(u.id, u.username, u.email) " +
           "FROM User u WHERE u.department = :dept")
    List<UserDTO> findUsersByDepartment(@Param("dept") String department);
}
@Service
public class ReportService {
    @Transactional(readOnly = true)
    public ComplexReport generateComplexReport(ReportRequest request) {
        // 多個查詢操作,使用只讀事務(wù)優(yōu)化
        List<Data> dataSet1 = repository1.findByCriteria(request);
        List<Data> dataSet2 = repository2.findByCriteria(request);
        Statistics stats = repository3.calculateStatistics(request);
        return assembleReport(dataSet1, dataSet2, stats);
    }
}

2.5 回滾規(guī)則(rollbackFor/noRollbackFor)

精細(xì)控制哪些異常觸發(fā)回滾,哪些異常不觸發(fā)回滾。

@Service
public class OrderProcessingService {
    // 業(yè)務(wù)異常不回滾,系統(tǒng)異?;貪L
    @Transactional(
        rollbackFor = {SystemException.class, DataAccessException.class},
        noRollbackFor = {BusinessException.class, ValidationException.class}
    )
    public OrderResult processOrder(OrderRequest request) {
        // 參數(shù)驗證失敗不觸發(fā)事務(wù)回滾
        validateOrder(request);
        try {
            // 業(yè)務(wù)處理
            Order order = createOrder(request);
            processPayment(order);
            updateInventory(order);
            // 發(fā)送通知(即使失敗也不應(yīng)該回滾整個事務(wù))
            try {
                notificationService.sendOrderConfirmation(order);
            } catch (NotificationException e) {
                log.warn("訂單通知發(fā)送失敗,訂單號: {}", order.getOrderNo(), e);
                // 記錄通知失敗,但不回滾事務(wù)
                notificationLogRepository.saveFailureLog(order, e);
            }
            return OrderResult.success(order);
        } catch (InsufficientStockException e) {
            // 庫存不足是業(yè)務(wù)異常,需要特殊處理但不一定回滾
            log.error("庫存不足,訂單處理失敗", e);
            throw new BusinessException("庫存不足,請調(diào)整商品數(shù)量", e);
        }
    }
    // 自定義回滾邏輯
    @Transactional
    public void processWithCustomRollback(ProcessRequest request) {
        try {
            step1(request);
            step2(request);
            step3(request);
        } catch (Exception e) {
            // 記錄錯誤信息
            errorLogRepository.save(createErrorLog(request, e));
            // 根據(jù)異常類型決定是否回滾
            if (shouldRollback(e)) {
                // 重新拋出異常觸發(fā)Spring事務(wù)回滾
                throw e;
            } else {
                // 執(zhí)行補(bǔ)償操作但不回滾
                executeCompensation(request);
            }
        }
    }
}

2.6 事務(wù)管理器(transactionManager)

在多個數(shù)據(jù)源場景下指定使用的事務(wù)管理器。

@Configuration
public class DataSourceConfig {
    @Primary
    @Bean(name = "primaryTransactionManager")
    public PlatformTransactionManager primaryTransactionManager(
            @Qualifier("primaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    @Bean(name = "secondaryTransactionManager")
    public PlatformTransactionManager secondaryTransactionManager(
            @Qualifier("secondaryDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}
@Service
public class MultiDataSourceService {
    // 使用主數(shù)據(jù)源的事務(wù)
    @Transactional("primaryTransactionManager")
    public void processWithPrimaryDataSource() {
        primaryRepository.save(new PrimaryEntity());
        // 主數(shù)據(jù)源操作
    }
    // 使用次要數(shù)據(jù)源的事務(wù)
    @Transactional("secondaryTransactionManager")
    public void processWithSecondaryDataSource() {
        secondaryRepository.save(new SecondaryEntity());
        // 次要數(shù)據(jù)源操作
    }
    // 分布式事務(wù)場景(需要XA事務(wù)管理器)
    @Transactional("xaTransactionManager")
    public void processDistributedTransaction() {
        // 操作多個資源管理器
        resource1Repository.update();
        resource2Repository.update();
        jmsTemplate.send(destination, messageCreator);
    }
}

三、高級應(yīng)用與最佳實(shí)踐

3.1 事務(wù)注解的繼承與覆蓋規(guī)則

// 基礎(chǔ)服務(wù)類定義通用事務(wù)配置
@Service
@Transactional(
    readOnly = true,
    timeout = 30,
    propagation = Propagation.SUPPORTS
)
public abstract class BaseService {
    protected void commonOperation() {
        // 通用操作
    }
}
// 具體服務(wù)類可以覆蓋事務(wù)配置
@Service
public class UserService extends BaseService {
    // 覆蓋為讀寫事務(wù)
    @Transactional(
        readOnly = false,
        propagation = Propagation.REQUIRED,
        rollbackFor = Exception.class
    )
    public User createUser(UserCreateRequest request) {
        // 創(chuàng)建用戶操作
        return userRepository.save(convertToEntity(request));
    }
    // 繼承基類的只讀事務(wù)配置
    public User getUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

3.2 多方法組合事務(wù)控制

@Service
public class ComplexBusinessService {
    @Autowired
    private AccountService accountService;
    @Autowired
    private AuditService auditService;
    // 外層事務(wù)方法
    @Transactional(propagation = Propagation.REQUIRED)
    public void complexBusinessProcess(BusinessRequest request) {
        // 步驟1:數(shù)據(jù)準(zhǔn)備(在同一個事務(wù)中)
        prepareData(request);
        // 步驟2:調(diào)用內(nèi)層事務(wù)方法
        try {
            // 內(nèi)層方法使用REQUIRES_NEW,創(chuàng)建獨(dú)立事務(wù)
            accountService.processPayment(request.getPayment());
        } catch (PaymentException e) {
            // 支付失敗,但外層事務(wù)繼續(xù)執(zhí)行
            handlePaymentFailure(request, e);
        }
        // 步驟3:記錄審計日志(使用NOT_SUPPORTED,掛起當(dāng)前事務(wù))
        auditService.logOperation(request);
        // 步驟4:最終提交(如果前面的REQUIRES_NEW事務(wù)失敗,這里仍可提交)
        completeProcess(request);
    }
    private void prepareData(BusinessRequest request) {
        // 準(zhǔn)備業(yè)務(wù)數(shù)據(jù)
    }
    private void handlePaymentFailure(BusinessRequest request, PaymentException e) {
        // 處理支付失敗
    }
    private void completeProcess(BusinessRequest request) {
        // 完成處理
    }
}

3.3 性能優(yōu)化建議

  1. 合理設(shè)置只讀事務(wù):對于查詢操作,始終使用readOnly = true
  2. 適當(dāng)調(diào)整隔離級別:根據(jù)業(yè)務(wù)需求選擇最低可接受的隔離級別
  3. 設(shè)置合理的超時時間:避免事務(wù)長時間占用數(shù)據(jù)庫連接
  4. 避免大事務(wù):將大事務(wù)拆分為多個小事務(wù)
  5. 使用延遲加載和分頁:處理大量數(shù)據(jù)時避免內(nèi)存溢出

四、常見陷阱與解決方案

4.1 事務(wù)失效的常見原因

@Service
public class TransactionTrapService {
    // 陷阱1:自調(diào)用導(dǎo)致事務(wù)失效
    public void selfInvocationTrap() {
        // 直接調(diào)用內(nèi)部方法,事務(wù)注解不會生效
        internalTransactionMethod();
        // 解決方案:通過AopContext獲取代理對象
        // ((TransactionTrapService) AopContext.currentProxy()).internalTransactionMethod();
    }
    @Transactional
    public void internalTransactionMethod() {
        // 這個方法的事務(wù)不會生效
    }
    // 陷阱2:異常被捕獲未拋出
    @Transactional
    public void exceptionHandlingTrap() {
        try {
            riskyOperation();
        } catch (Exception e) {
            // 異常被捕獲,事務(wù)不會回滾
            log.error("操作失敗", e);
            // 解決方案1:重新拋出異常
            // throw e;
            // 解決方案2:手動回滾
            // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    // 陷阱3:非public方法
    @Transactional
    protected void nonPublicMethod() {
        // Spring基于代理的事務(wù)只對public方法生效
    }
}

4.2 調(diào)試與監(jiān)控

@Aspect
@Component
@Slf4j
public class TransactionMonitoringAspect {
    @Around("@annotation(transactional)")
    public Object monitorTransaction(ProceedingJoinPoint joinPoint, 
                                     Transactional transactional) throws Throwable {
        String methodName = joinPoint.getSignature().toShortString();
        log.info("事務(wù)開始 - 方法: {}, 傳播行為: {}, 隔離級別: {}", 
                 methodName, 
                 transactional.propagation(),
                 transactional.isolation());
        long startTime = System.currentTimeMillis();
        try {
            Object result = joinPoint.proceed();
            long duration = System.currentTimeMillis() - startTime;
            log.info("事務(wù)提交成功 - 方法: {}, 耗時: {}ms", 
                     methodName, duration);
            return result;
        } catch (Exception e) {
            long duration = System.currentTimeMillis() - startTime;
            log.error("事務(wù)回滾 - 方法: {}, 耗時: {}ms, 異常: {}", 
                      methodName, duration, e.getClass().getSimpleName());
            throw e;
        }
    }
}

五、總結(jié)

Spring的@Transactional注解提供了豐富而強(qiáng)大的事務(wù)控制能力,合理使用這些參數(shù)可以:

  1. 確保數(shù)據(jù)一致性:通過合適的傳播行為和隔離級別
  2. 提升系統(tǒng)性能:通過只讀事務(wù)、超時設(shè)置等優(yōu)化
  3. 增強(qiáng)系統(tǒng)可靠性:通過精細(xì)的回滾控制
  4. 支持復(fù)雜業(yè)務(wù)場景:通過多數(shù)據(jù)源、分布式事務(wù)支持

掌握這些參數(shù)的正確使用方式,是成為高級Spring開發(fā)者的必備技能。在實(shí)際開發(fā)中,應(yīng)根據(jù)具體業(yè)務(wù)需求,仔細(xì)選擇和配置事務(wù)參數(shù),并在關(guān)鍵業(yè)務(wù)方法中添加適當(dāng)?shù)氖聞?wù)監(jiān)控和日志記錄。

擴(kuò)展閱讀建議

  • Spring聲明式事務(wù)的實(shí)現(xiàn)原理(基于AOP和動態(tài)代理)
  • 分布式事務(wù)解決方案(Seata、RocketMQ事務(wù)消息等)
  • 數(shù)據(jù)庫事務(wù)隔離級別的實(shí)現(xiàn)機(jī)制(鎖、MVCC等)
  • Spring Reactive事務(wù)管理

通過深入學(xué)習(xí)這些相關(guān)內(nèi)容,你將能夠構(gòu)建更加健壯、可靠的企業(yè)級應(yīng)用系統(tǒng)。

如需獲取更多關(guān)于Spring IoC容器深度解析、Bean生命周期管理、循環(huán)依賴解決方案、條件化配置等內(nèi)容,請持續(xù)關(guān)注本專欄《Spring核心技術(shù)深度剖析》系列文章。

到此這篇關(guān)于Spring事務(wù)注解@Transactional參數(shù)詳解與實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Spring事務(wù)注解@Transactional參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java事務(wù)回滾失敗問題分析

    java事務(wù)回滾失敗問題分析

    這篇文章主要介紹了java事務(wù)回滾失敗問題分析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 從簡單到進(jìn)階解析Java調(diào)用Python的5種實(shí)用方案

    從簡單到進(jìn)階解析Java調(diào)用Python的5種實(shí)用方案

    在機(jī)器學(xué)習(xí)與大數(shù)據(jù)融合的今天,Java與Python的協(xié)同開發(fā)已成為企業(yè)級應(yīng)用的常見需求,本文將通過真實(shí)案例解析5種主流調(diào)用方案,需要的小伙伴可以了解下
    2025-09-09
  • Spring中GET請求參數(shù)偶發(fā)性丟失問題分析及修復(fù)

    Spring中GET請求參數(shù)偶發(fā)性丟失問題分析及修復(fù)

    本文描述了一種在SpringCloud微服務(wù)架構(gòu)下GET接口偶爾出現(xiàn)參數(shù)丟失的問題,通過源碼分析和復(fù)現(xiàn),發(fā)現(xiàn)問題是由于線程中請求對象的生命周期管理導(dǎo)致的,解決方法包括改用POST請求或更換Tomcat為Undertow中間件,需要的朋友可以參考下
    2025-04-04
  • 基于Java?GUI?事件處理方式

    基于Java?GUI?事件處理方式

    這篇文章主要介紹了基于Java?GUI?事件處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中的轉(zhuǎn)換流、壓縮流、序列化流、打印流及應(yīng)用場景

    Java中的轉(zhuǎn)換流、壓縮流、序列化流、打印流及應(yīng)用場景

    這篇文章主要介紹了Java中的轉(zhuǎn)換流、壓縮流、序列化流、打印流及應(yīng)用場景,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • springBoot集成flowable的流程解析

    springBoot集成flowable的流程解析

    這篇文章主要介紹了springBoot集成flowable的流程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • 詳解Java中的字節(jié)碼增強(qiáng)技術(shù)

    詳解Java中的字節(jié)碼增強(qiáng)技術(shù)

    字節(jié)碼增強(qiáng)技術(shù)就是一類對現(xiàn)有字節(jié)碼進(jìn)行修改或者動態(tài)生成全新字節(jié)碼文件的技術(shù)。本文將通過示例詳細(xì)說說Java的字節(jié)碼增強(qiáng)技術(shù),需要的可以參考一下
    2022-10-10
  • mybatisPlus更新策略導(dǎo)致更新失敗問題

    mybatisPlus更新策略導(dǎo)致更新失敗問題

    這篇文章主要介紹了mybatisPlus更新策略導(dǎo)致更新失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 詳解SpringIOC BeanDeifition

    詳解SpringIOC BeanDeifition

    這篇文章主要介紹了SpringIOC BeanDeifition的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)springioc,感興趣的朋友可以了解下
    2020-12-12
  • 淺談利用Session防止表單重復(fù)提交

    淺談利用Session防止表單重復(fù)提交

    這篇文章主要介紹了淺談利用Session防止表單重復(fù)提交,簡單介紹表單重復(fù)提交的情況,分析,以及解決方法代碼示例,具有一定借鑒價值,需要的朋友可以了解下。
    2017-12-12

最新評論

平顺县| 临夏县| 增城市| 红桥区| 石城县| 布尔津县| 夏河县| 湘阴县| 普安县| 海口市| 衡东县| 泰和县| 淳化县| 沅陵县| 固原市| 会昌县| 江川县| 晋城| 运城市| 商水县| 苏尼特左旗| 崇左市| 府谷县| 延川县| 鄂伦春自治旗| 弥渡县| 荣成市| 临江市| 广灵县| 滨州市| 肇源县| 绥德县| 榆中县| 金山区| 泸州市| 辛集市| 阿尔山市| 彰化县| 肥乡县| 澎湖县| 勐海县|