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

@Transactional解讀(作用、失效場(chǎng)景與解決方式)

 更新時(shí)間:2024年08月21日 11:21:11   作者:我認(rèn)不到你  
這篇文章主要介紹了關(guān)于@Transactional作用、失效場(chǎng)景與解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、了解@Transactional注解

先要知道事務(wù)是什么,但既然知道了這個(gè)注解,不知道事務(wù)是什么,那就重新再去學(xué)習(xí)一遍數(shù)據(jù)庫(kù)吧,這里講解開(kāi)發(fā)中代碼實(shí)現(xiàn)事務(wù)的方式

1、編程式事務(wù)(開(kāi)發(fā)用的很少了)

基于底層的API,如PlatformTransactionManagerTransactionDefinitionTransactionTemplate 等核心接口,開(kāi)發(fā)者完全可以通過(guò)編程的方式來(lái)進(jìn)行事務(wù)管理。

@SpringBootTest
@Slf4j
public class Test {
    @Autowired
    PlatformTransactionManager transactionManager;


    @Autowired
    private TransactionTemplate transactionTemplate;

    @Autowired
    UserService userService;

    @Test
    public void transactionManagerTest(){
        //事務(wù)基礎(chǔ)信息 超時(shí)時(shí)間、隔離級(jí)別、傳播屬性等
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();; // 定義事務(wù)屬性
        // 設(shè)置傳播行為屬性, 默認(rèn)事務(wù)級(jí)別。 當(dāng)前無(wú)事務(wù)則新建事務(wù),已有事務(wù)則加入事務(wù)。
        def.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
        // 獲得事務(wù)狀態(tài)
        TransactionStatus status = transactionManager.getTransaction(def);

        try {
            log.info("執(zhí)行事務(wù)方法");
            // 這里用到 lombok 的鏈?zhǔn)骄幊?,很?jiǎn)單的原理,set一般不是返回void嗎,只需要改為返回當(dāng)前對(duì)象,就是this,就可以實(shí)現(xiàn)此功能了
            User user = new User().setName("張三");
            // 事務(wù)操作
            // 數(shù)據(jù)庫(kù)操作
            userService.insertUser(user);
            //手動(dòng)設(shè)置異常
            int i = 1 / 0;
            // 事務(wù)提交
            transactionManager.commit(status);// 提交事務(wù)
        } catch (Exception e) {
            // 事務(wù)提交
            transactionManager.rollback(status);
            log.error("執(zhí)行事務(wù)異常,需要回滾");
        }
    }

    @Test
    public void transactionTemplateTest() {
        Object execute = transactionTemplate.execute(new TransactionCallback() {
            /**
             * @param transactionStatus 事務(wù)運(yùn)行狀態(tài)信息 是否是新事務(wù)、是否已被標(biāo)記為回滾等
             * @return
             */
            @Override
            public Object doInTransaction(TransactionStatus transactionStatus) {
                try {
                    log.info("執(zhí)行事務(wù)方法");
                    User user = new User().setName("張三");
                    userService.insertUser(user);
                    // 手動(dòng)設(shè)置異常
                    int i = 1 / 0;
                    log.info("正常執(zhí)行完成");
                    return "成功";
                } catch (Exception e) {
                    log.error("執(zhí)行事務(wù)異常,需要回滾",e);
                    transactionStatus.setRollbackOnly();
                    return "失敗";
                }
            }
        });
    }
}

2、聲明式事務(wù)(主流,也是本文的主角==@Transactional==)

聲明式事務(wù)管理方法允許開(kāi)發(fā)者配置的幫助下來(lái)管理事務(wù),而不需要依賴底層API進(jìn)行硬編碼。

開(kāi)發(fā)者可以只使用注解或基于配置的 XML 來(lái)管理事務(wù)。

    @Test
    // 這個(gè)注解還是有很多坑需要注意,這在后文中會(huì)講
    @Transactional(rollbackFor = Exception.class)
    public void transactionalTest(){
        // 只用正常些業(yè)務(wù)代碼就可以了,一切交給 Spring 來(lái)處理,這里 @Transactional 注解用到的知識(shí)就是 AOP
        try {
            User user = new User().setName("張三");
            // 數(shù)據(jù)庫(kù)操作
            userService.insertUser(user);
            // 手動(dòng)設(shè)置異常
            int i = 1 / 0;
        } catch (Exception e) {
            log.error("執(zhí)行事務(wù)異常,需要回滾",e);
            // 如果異常被 try 、 catch 吞了是不會(huì)回滾的,所有手動(dòng)拋出去
            throw e;
        }
    }

二、@Transactional介紹

1、@Transactional注解可以作用于哪些地方?

@Transactional 可以作用在接口、類、類方法

  • 作用于類:當(dāng)把@Transactional 注解放在類上時(shí),表示所有該類的public方法都配置相同的事務(wù)屬性信息。
  • 作用于方法:當(dāng)類配置了@Transactional,方法也配置了@Transactional,方法的事務(wù)會(huì)覆蓋類的事務(wù)配置信息。
  • 作用于接口:不推薦這種使用方法,因?yàn)橐坏?biāo)注在Interface上并且配置了Spring AOP 使用CGLib動(dòng)態(tài)代理,將會(huì)導(dǎo)致@Transactional注解失效
@Transactional(rollbackFor = Exception.class)
@RestController
@Slf4j
public class TestController {
        @Autowired
        UserService userService;

        @RequestMapping("/test")
        // 這個(gè)注解還是有很多坑需要注意,這在后文中會(huì)講
        @Transactional(rollbackFor = Exception.class)
        public void transactionalTest(){
            // 只用正常些業(yè)務(wù)代碼就可以了,一切交給 Spring 來(lái)處理,這里 @Transactional 注解用到的知識(shí)就是 AOP
            try {
                User user = new User().setName("張三");
                // 數(shù)據(jù)庫(kù)操作
                userService.insertUser(user);
                // 手動(dòng)設(shè)置異常
                int i = 1 / 0;
            } catch (Exception e) {
                log.error("執(zhí)行事務(wù)異常,需要回滾",e);
                // 如果異常被 try 、 catch 吞了是不會(huì)回滾的,所有手動(dòng)拋出去
                throw e;
            }
        }
}

2、@Transactional注有哪些屬性?

propagation屬性

propagation 代表事務(wù)的傳播行為,默認(rèn)值為 Propagation.REQUIRED,其他的屬性信息如下:

  • Propagation.REQUIRED:如果當(dāng)前存在事務(wù),則加入該事務(wù),如果當(dāng)前不存在事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。( 也就是說(shuō)如果A方法和B方法都添加了注解,在默認(rèn)傳播模式下,A方法內(nèi)部調(diào)用B方法,會(huì)把兩個(gè)方法的事務(wù)合并為一個(gè)事務(wù)
  • Propagation.SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
  • Propagation.MANDATORY:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則拋出異常。
  • Propagation.REQUIRES_NEW:重新創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),暫停當(dāng)前的事務(wù)。( 當(dāng)類A中的 a 方法用默認(rèn)Propagation.REQUIRED模式,類B中的 b方法加上采用 Propagation.REQUIRES_NEW模式,然后在 a 方法中調(diào)用 b方法操作數(shù)據(jù)庫(kù),然而 a方法拋出異常后,b方法并沒(méi)有進(jìn)行回滾,因?yàn)镻ropagation.REQUIRES_NEW會(huì)暫停 a方法的事務(wù) )
  • Propagation.NOT_SUPPORTED:以非事務(wù)的方式運(yùn)行,如果當(dāng)前存在事務(wù),暫停當(dāng)前的事務(wù)。
  • Propagation.NEVER:以非事務(wù)的方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。
  • Propagation.NESTED :和 Propagation.REQUIRED 效果一樣。

isolation 屬性

isolation :事務(wù)的隔離級(jí)別,默認(rèn)值為Isolation.DEFAULT

  • Isolation.DEFAULT:使用底層數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別。
  • Isolation.READ_UNCOMMITTED:讀未提交
  • Isolation.READ_COMMITTED:讀已提交
  • Isolation.REPEATABLE_READ:可重復(fù)讀
  • Isolation.SERIALIZABLE:串行化

timeout 屬性

  • timeout :事務(wù)的超時(shí)時(shí)間,默認(rèn)值為 -1。
  • 如果超過(guò)該時(shí)間限制但事務(wù)還沒(méi)有完成,則自動(dòng)回滾事務(wù)。

readOnly 屬性

  • readOnly :指定事務(wù)是否為只讀事務(wù),默認(rèn)值為 false;
  • 為了忽略那些不需要事務(wù)的方法,比如讀取數(shù)據(jù),可以設(shè)置 read-only 為 true。

rollbackFor 屬性

  • rollbackFor :用于指定能夠觸發(fā)事務(wù)回滾的異常類型
  • 可以指定多個(gè)異常類型

noRollbackFor屬性

  • noRollbackFor:拋出指定的異常類型,不回滾事務(wù)
  • 也可以指定多個(gè)異常類型

三、@Transactional失效場(chǎng)景與解決辦法

1、@Transactional 應(yīng)用在非 public 修飾的方法上

首先JDK動(dòng)態(tài)代理肯定只能是public,因?yàn)榻涌诘臋?quán)限修飾符只能是public,所以其他的修飾符不可以使用,cglib代理的方式是可以代理protected方法的如果支持protected,大概率會(huì)造成當(dāng)切換代理的實(shí)現(xiàn)方式時(shí)表現(xiàn)不同,所以會(huì)出現(xiàn)很多的bug,然后造成一系列的問(wèn)題

之所以會(huì)失效是因?yàn)樵赟pring AOP 代理時(shí),如上圖所示 TransactionInterceptor (事務(wù)攔截器)在目標(biāo)方法執(zhí)行前后進(jìn)行攔截,DynamicAdvisedInterceptor(CglibAopProxy 的內(nèi)部類)的 intercept 方法或 JdkDynamicAopProxy 的 invoke 方法會(huì)間接調(diào)用 AbstractFallbackTransactionAttributeSource的 computeTransactionAttribute方法,獲取Transactional 注解的事務(wù)配置信息。

AbstractFallbackTransactionAttributeSource類:

protected TransactionAttribute computeTransactionAttribute(Method method,
    Class<?> targetClass) {
   
        // Don't allow no-public methods as required.
        if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
   
	return null;
        }

這個(gè)方法會(huì)檢查目標(biāo)方法的修飾符是不是 public,若不是 public,就不會(huì)獲取@Transactional 的屬性配置信息,最終會(huì)造成不會(huì)用 TransactionInterceptor 來(lái)攔截該目標(biāo)方法進(jìn)行事務(wù)管理。

2、@Transactional 注解屬性 propagation 設(shè)置錯(cuò)誤

這種失效是由于配置錯(cuò)誤,若是錯(cuò)誤的配置以下三種 propagation,事務(wù)將不會(huì)發(fā)生回滾。

  • TransactionDefinition.PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。

3、@Transactional 注解屬性 rollbackFor 設(shè)置錯(cuò)誤

rollbackFor 可以指定能夠觸發(fā)事務(wù)回滾的異常類型。

Spring默認(rèn)拋出了未檢查unchecked異常(繼承自 RuntimeException 的異常)或者 Error才回滾事務(wù);其他異常不會(huì)觸發(fā)回滾事務(wù)。

如果在事務(wù)中拋出其他類型的異常,但卻期望 Spring 能夠回滾事務(wù),就需要指定 rollbackFor屬性。

若在目標(biāo)方法中拋出的異常是 rollbackFor 指定的異常的子類,事務(wù)同樣會(huì)回滾。

Spring源碼如下:

private int getDepth(Class<?> exceptionClass, int depth) {
        if (exceptionClass.getName().contains(this.exceptionName)) {
            // Found it!
            return depth;
}
        // If we've gone as far as we can go and haven't found it...
        if (exceptionClass == Throwable.class) {
            return -1;
}
return getDepth(exceptionClass.getSuperclass(), depth + 1);
}

所以一般使用

@Transactional(rollbackFor = Exception.class) 

就可以了,但可以根據(jù)業(yè)務(wù)自定義異常類

4、同一個(gè)類中方法調(diào)用,導(dǎo)致@Transactional失效

開(kāi)發(fā)中避免不了會(huì)對(duì)同一個(gè)類里面的方法調(diào)用,比如有一個(gè)類Test,它的一個(gè)方法A,A再調(diào)用本類的方法B(不論方法B是用public還是private修飾),但方法A沒(méi)有聲明注解事務(wù),而B(niǎo)方法有。則外部調(diào)用方法A之后,方法B的事務(wù)是不會(huì)起作用的。這也是經(jīng)常犯錯(cuò)誤的一個(gè)地方。

那為啥會(huì)出現(xiàn)這種情況?其實(shí)這還是由于使用Spring AOP代理造成的,因?yàn)橹挥挟?dāng)事務(wù)方法被當(dāng)前類以外的代碼調(diào)用時(shí),才會(huì)由Spring生成的代理對(duì)象來(lái)管理。

錯(cuò)誤入下:(但反過(guò)來(lái)(transactionalTest方法(@Transactional在transactionalTest方法上)調(diào)用Test方法)可以讓@Transactional生效)

@RestController
@Slf4j
public class TestController {
    @Autowired
    UserService userService;

    @RequestMapping("/test")
    public void Test(){
        // 這里就相當(dāng)于使用了 this.transactionalTest(); 使用的是本地對(duì)象的方法,沒(méi)有用到spring容器,就無(wú)法觸發(fā)AOP,導(dǎo)致事務(wù)失效
        transactionalTest();
    }
    
    // 這個(gè)注解還是有很多坑需要注意,這在后文中會(huì)講
    @Transactional(rollbackFor = Exception.class)
    public void transactionalTest(){
        // 只用正常些業(yè)務(wù)代碼就可以了,一切交給 Spring 來(lái)處理,這里 @Transactional 注解用到的知識(shí)就是 AOP
        try {
            User user = new User().setName("張三");
            // 數(shù)據(jù)庫(kù)操作
            userService.insertUser(user);
            // 手動(dòng)設(shè)置異常
            int i = 1 / 0;
        } catch (Exception e) {
            log.error("執(zhí)行事務(wù)異常,需要回滾",e);
            // 如果異常被 try 、 catch 吞了是不會(huì)回滾的,所有手動(dòng)拋出去
            throw e;
        }
    }
}

解決方法:使用該類的Spring代理對(duì)象就可以了

  • 1、AopContext.currentProxy()獲得當(dāng)前代理對(duì)象,注意:類上也需要加@EnableAspectJAutoProxy注解(推薦)
@RestController
@Slf4j
@EnableAspectJAutoProxy(proxyTargetClass = true,exposeProxy = true)
public class TestController {
    @Autowired
    UserService userService;



    @RequestMapping("/test")
    public void Test(){
        // 這里就相當(dāng)于使用了 this.transactionalTest(); 使用的是本地對(duì)象的方法,沒(méi)有用到spring容器,就無(wú)法觸發(fā)AOP,導(dǎo)致事務(wù)失效
        ((TestController) AopContext.currentProxy()).transactionalTest();
    }

    // 這個(gè)注解還是有很多坑需要注意,這在后文中會(huì)講
    @Transactional(rollbackFor = Exception.class)
    public void transactionalTest(){
        // 只用正常些業(yè)務(wù)代碼就可以了,一切交給 Spring 來(lái)處理,這里 @Transactional 注解用到的知識(shí)就是 AOP
        try {
            User user = new User().setName("張三");
            // 數(shù)據(jù)庫(kù)操作
            userService.insertUser(user);
            // 手動(dòng)設(shè)置異常
            int i = 1 / 0;
        } catch (Exception e) {
            log.error("執(zhí)行事務(wù)異常,需要回滾",e);
            // 如果異常被 try 、 catch 吞了是不會(huì)回滾的,所有手動(dòng)拋出去
            throw e;
        }
    }
}
  • 2、寫(xiě)到另一個(gè)類中使用@Autowired調(diào)用(這個(gè)就不細(xì)說(shuō)了)
  • 3、@Autowired本類(沒(méi)試過(guò),聽(tīng)說(shuō)可以)
@RestController
@Slf4j
public class TestController {
    @Autowired
    UserService userService;
    @Autowired
    TestController testController;



    @RequestMapping("/test")
    public void Test(){
        testController.transactionalTest();
    }

    // 這個(gè)注解還是有很多坑需要注意,這在后文中會(huì)講
    @Transactional(rollbackFor = Exception.class)
    public void transactionalTest(){
        // 只用正常些業(yè)務(wù)代碼就可以了,一切交給 Spring 來(lái)處理,這里 @Transactional 注解用到的知識(shí)就是 AOP
        try {
            User user = new User().setName("張三");
            // 數(shù)據(jù)庫(kù)操作
            userService.insertUser(user);
            // 手動(dòng)設(shè)置異常
            int i = 1 / 0;
        } catch (Exception e) {
            log.error("執(zhí)行事務(wù)異常,需要回滾",e);
            // 如果異常被 try 、 catch 吞了是不會(huì)回滾的,所有手動(dòng)拋出去
            throw e;
        }
    }
}
  • 4、實(shí)現(xiàn)ApplicationContextAware接口,獲取Bean
@RestController
@Slf4j
public class TestController implements ApplicationContextAware {
    @Autowired
    UserService userService;

    private static ApplicationContext applicationContext;


    @RequestMapping("/test")
    public void Test(){
        TestController bean = applicationContext.getBean(TestController.class);
        bean.transactionalTest();
    }

    // 這個(gè)注解還是有很多坑需要注意,這在后文中會(huì)講
    @Transactional(rollbackFor = Exception.class)
    public void transactionalTest(){
        // 只用正常些業(yè)務(wù)代碼就可以了,一切交給 Spring 來(lái)處理,這里 @Transactional 注解用到的知識(shí)就是 AOP
        try {
            User user = new User().setName("張三");
            // 數(shù)據(jù)庫(kù)操作
            userService.insertUser(user);
            // 手動(dòng)設(shè)置異常
            int i = 1 / 0;
        } catch (Exception e) {
            log.error("執(zhí)行事務(wù)異常,需要回滾",e);
            // 如果異常被 try 、 catch 吞了是不會(huì)回滾的,所有手動(dòng)拋出去
            throw e;
        }
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        TestController.applicationContext = applicationContext;
    }
}
  • 5、一切可以獲取Spring對(duì)象的應(yīng)該都可以 ╭(?´^`?)╮

5、異常被你的 catch“吃了”導(dǎo)致@Transactional失效

AOP 可以說(shuō)是生成一個(gè)代理類,可以在這個(gè)方法的頭和尾添加代碼,比如代理類使用一個(gè)try、catch把這個(gè)方法給套起來(lái)了,只有這個(gè)方法拋出異常之后,調(diào)用了代理類中catch的事務(wù)回滾代碼才能回滾,所以你沒(méi)拋出異常的話,@Transactional認(rèn)為你是正常運(yùn)行的代碼所以不回滾

    @Transactional(rollbackFor = Exception.class)
    public void transactionalTest(){
        // 只用正常些業(yè)務(wù)代碼就可以了,一切交給 Spring 來(lái)處理,這里 @Transactional 注解用到的知識(shí)就是 AOP
        try {
            User user = new User().setName("張三");
            // 數(shù)據(jù)庫(kù)操作
            userService.insertUser(user);
            // 手動(dòng)設(shè)置異常
            int i = 1 / 0;
        } catch (Exception e) {
            // 為啥寫(xiě) catch ,還要寫(xiě) throw e 拋出異常呢,因?yàn)橐浫罩景?,不記日志的話也可以不用,但哪個(gè)不寫(xiě)報(bào)錯(cuò)日志,出bug不是給自己挖坑嗎
            log.error("執(zhí)行事務(wù)異常,需要回滾",e);
            // 如果異常被 try 、 catch 吞了是不會(huì)回滾的
//            throw e;
        }
    }

6、數(shù)據(jù)庫(kù)引擎不支持事務(wù)

這種情況出現(xiàn)的概率并不高,事務(wù)能否生效數(shù)據(jù)庫(kù)引擎是否支持事務(wù)是關(guān)鍵。

常用的MySQL數(shù)據(jù)庫(kù)默認(rèn)使用支持事務(wù)的innodb引擎。

一旦數(shù)據(jù)庫(kù)引擎切換成不支持事務(wù)的myisam,那事務(wù)就從根本上失效了。

總結(jié)

@Transactional非常的好用,只需要一個(gè)注解就可以不用管事務(wù)操作了,只需要注重自己的業(yè)務(wù)代碼就可以了

@Transactional也有缺點(diǎn),比如你要注意上訴的幾種失效情況,他有個(gè)局限性,他的最小粒度要作用在方法上,也就是說(shuō),如果想要給一部分代碼塊增加事務(wù)的話,那就需要把這個(gè)部分代碼塊單獨(dú)獨(dú)立出來(lái)作為一個(gè)方法。而且AOP要生成一個(gè)動(dòng)態(tài)代理類,所以會(huì)慢一點(diǎn)

但是誰(shuí)會(huì)管這些啊,好用就行了,也不是不能忍的問(wèn)題,這跟他的好處根本不成正比,當(dāng)然如果要使用編程式事務(wù)也可以,看個(gè)人愛(ài)好,反之小編一直用的是@Transactional,Spring官方也推薦使用@Transactional,所以了解了怎么使用之后,大膽的用就好了

這種情況出現(xiàn)的概率并不高,事務(wù)能否生效數(shù)據(jù)庫(kù)引擎是否支持事務(wù)是關(guān)鍵。常用的MySQL數(shù)據(jù)庫(kù)默認(rèn)使用支持事務(wù)的innodb引擎。一旦數(shù)據(jù)庫(kù)引擎切換成不支持事務(wù)的myisam,那事務(wù)就從根本上失效了。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Java實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)之并查集

    詳解Java實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)之并查集

    并查集這種數(shù)據(jù)結(jié)構(gòu),可能出現(xiàn)的頻率不是那么高,但是還會(huì)經(jīng)常性的見(jiàn)到,其理解學(xué)習(xí)起來(lái)非常容易,通過(guò)本文,一定能夠輕輕松松搞定并查集
    2021-06-06
  • java報(bào)錯(cuò)之springboot3+vue2項(xiàng)目web服務(wù)層報(bào)錯(cuò)總結(jié)

    java報(bào)錯(cuò)之springboot3+vue2項(xiàng)目web服務(wù)層報(bào)錯(cuò)總結(jié)

    java入門(mén)學(xué)習(xí),隨手記錄一下開(kāi)發(fā)過(guò)程中產(chǎn)生的報(bào)錯(cuò),有些錯(cuò)誤是網(wǎng)上搜索再加上自己嘗試,隨手引用了一些其他人的記錄,也是留給自己看的,或是希望能對(duì)其他初學(xué)者有幫助

    2023-06-06
  • java 讀取文件路徑空格、

    java 讀取文件路徑空格、"+"和中文的處理方法

    今天小編就為大家分享一篇java 讀取文件路徑空格、"+"和中文的處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 基于Java ActiveMQ的實(shí)例講解

    基于Java ActiveMQ的實(shí)例講解

    下面小編就為大家?guī)?lái)一篇基于Java ActiveMQ的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 用命令行編譯java并生成可執(zhí)行的jar包方法

    用命令行編譯java并生成可執(zhí)行的jar包方法

    下面小編就為大家分享一篇用命令行編譯java并生成可執(zhí)行的jar包方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Java利用File類創(chuàng)建文件的示例代碼

    Java利用File類創(chuàng)建文件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java中的File類創(chuàng)建文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 解決SpringCloud Gateway配置自定義路由404的坑

    解決SpringCloud Gateway配置自定義路由404的坑

    這篇文章主要介紹了解決SpringCloud Gateway配置自定義路由404的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • json解析時(shí)遇到英文雙引號(hào)報(bào)錯(cuò)的解決方法

    json解析時(shí)遇到英文雙引號(hào)報(bào)錯(cuò)的解決方法

    下面小編就為大家分享一篇json解析時(shí)遇到英文雙引號(hào)報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Java中的LinkedHashSet源碼解讀

    Java中的LinkedHashSet源碼解讀

    這篇文章主要介紹了Java中的LinkedHashSet源碼解讀,LinkedHashSet?是?Java?中的一個(gè)集合類,它是?HashSet?的子類,并實(shí)現(xiàn)了?Set?接口,與?HashSet?不同的是,LinkedHashSet?保留了元素插入的順序,并且具有?HashSet?的快速查找特性,需要的朋友可以參考下
    2023-09-09
  • VSCode?配置?Spring?Boot?項(xiàng)目開(kāi)發(fā)環(huán)境的全過(guò)程

    VSCode?配置?Spring?Boot?項(xiàng)目開(kāi)發(fā)環(huán)境的全過(guò)程

    兩三年前曾經(jīng)試過(guò)配置Java環(huán)境, 存在不少問(wèn)題作罷. 最近搜了下相關(guān)的文章, 感覺(jué)VSCode對(duì)Java項(xiàng)目的支持比三年前完善了不少. 今天實(shí)際配置了一下環(huán)境, 把自己常用的功能過(guò)了一遍, 基本能跑通開(kāi)發(fā)流程, 做個(gè)筆記,需要的朋友可以參考下
    2024-03-03

最新評(píng)論

沾化县| 通河县| 马边| 清新县| 搜索| 宜宾市| 班戈县| 公安县| 濮阳县| 涡阳县| 江达县| 峨山| 连州市| 西城区| 任丘市| 霍邱县| 天津市| 宿松县| 芦溪县| 迁西县| 顺昌县| 永城市| 佛冈县| 郓城县| 建瓯市| 蓝山县| 绥阳县| 德令哈市| 武功县| 额尔古纳市| 武安市| 霍州市| 城固县| 武陟县| 天气| 祁东县| 黄浦区| 玉林市| 龙陵县| 上高县| 大新县|