{"id":10008316,"date":"2023-09-22T16:30:05","date_gmt":"2023-09-22T08:30:05","guid":{"rendered":"https:\/\/blog.itmax.cn\/?p=10008316"},"modified":"2023-09-22T16:30:05","modified_gmt":"2023-09-22T08:30:05","slug":"%e6%94%af%e4%bb%98%e5%ae%9d%e4%b8%80%e9%9d%a2%ef%bc%9a%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%ba%8b%e5%8a%a1%e6%80%8e%e4%b9%88%e5%9b%9e%e6%bb%9a%ef%bc%9f%e8%af%b4%e7%94%a8-transactional-%e5%8f%af%e4%bb%a5","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10008316","title":{"rendered":"\u652f\u4ed8\u5b9d\u4e00\u9762\uff1a\u591a\u7ebf\u7a0b\u4e8b\u52a1\u600e\u4e48\u56de\u6eda\uff1f\u8bf4\u7528 @Transactional \u53ef\u4ee5\u56de\u53bb\u7b49\u901a\u77e5\u4e86\uff01"},"content":{"rendered":"<h2>\u80cc\u666f\u4ecb\u7ecd<\/h2>\n<p>1\uff0c\u6700\u8fd1\u6709\u4e00\u4e2a\u5927\u6570\u636e\u91cf\u63d2\u5165\u7684\u64cd\u4f5c\u5165\u5e93\u7684\u4e1a\u52a1\u573a\u666f\uff0c\u9700\u8981\u5148\u505a\u4e00\u4e9b\u5176\u4ed6\u4fee\u6539\u64cd\u4f5c\uff0c\u7136\u540e\u5728\u6267\u884c\u63d2\u5165\u64cd\u4f5c\uff0c\u7531\u4e8e\u63d2\u5165\u6570\u636e\u53ef\u80fd\u4f1a\u5f88\u591a\uff0c\u7528\u5230\u591a\u7ebf\u7a0b\u53bb\u62c6\u5206\u6570\u636e\u5e76\u884c\u5904\u7406\u6765\u63d0\u9ad8\u54cd\u5e94\u65f6\u95f4\uff0c\u5982\u679c\u6709\u4e00\u4e2a\u7ebf\u7a0b\u6267\u884c\u5931\u8d25\uff0c\u5219\u5168\u90e8\u56de\u6eda\u3002<\/p>\n<p>2\uff0c\u5728spring\u4e2d\u53ef\u4ee5\u4f7f\u7528<code>@Transactional<\/code>\u6ce8\u89e3\u53bb\u63a7\u5236\u4e8b\u52a1\uff0c\u4f7f\u51fa\u73b0\u5f02\u5e38\u65f6\u4f1a\u8fdb\u884c\u56de\u6eda\uff0c\u5728\u591a\u7ebf\u7a0b\u4e2d\uff0c\u8fd9\u4e2a\u6ce8\u89e3\u5219\u4e0d\u4f1a\u751f\u6548\uff0c\u5982\u679c\u4e3b\u7ebf\u7a0b\u9700\u8981\u5148\u6267\u884c\u4e00\u4e9b\u4fee\u6539\u6570\u636e\u5e93\u7684\u64cd\u4f5c\uff0c\u5f53\u5b50\u7ebf\u7a0b\u5728\u8fdb\u884c\u5904\u7406\u51fa\u73b0\u5f02\u5e38\u65f6\uff0c\u4e3b\u7ebf\u7a0b\u4fee\u6539\u7684\u6570\u636e\u5219\u4e0d\u4f1a\u56de\u6eda\uff0c\u5bfc\u81f4\u6570\u636e\u9519\u8bef\u3002<\/p>\n<p>3\uff0c\u4e0b\u9762\u7528\u4e00\u4e2a\u7b80\u5355\u793a\u4f8b\u6f14\u793a\u591a\u7ebf\u7a0b\u4e8b\u52a1\u3002<\/p>\n<h2>\u516c\u7528\u7684\u7c7b\u548c\u65b9\u6cd5<\/h2>\n<pre><code>\/**\n * \u5e73\u5747\u62c6\u5206list\u65b9\u6cd5.\n * @param source\n * @param n\n * @param &lt;T&gt;\n * @return\n *\/\npublic static &lt;T&gt; List&lt;List&lt;T&gt;&gt; averageAssign(List&lt;T&gt; source,int n){\n    List&lt;List&lt;T&gt;&gt; result=new ArrayList&lt;List&lt;T&gt;&gt;();\n    int remaider=source.size()%n;\n    int number=source.size()\/n;\n    int offset=0;\/\/\u504f\u79fb\u91cf\n    for(int i=0;i&lt;n;i++){\n        List&lt;T&gt; value=null;\n        if(remaider&gt;0){\n            value=source.subList(i*number+offset, (i+1)*number+offset+1);\n            remaider--;\n            offset++;\n        }else{\n            value=source.subList(i*number+offset, (i+1)*number+offset);\n        }\n        result.add(value);\n    }\n    return result;\n}\n\/**  \u7ebf\u7a0b\u6c60\u914d\u7f6e\n * @version V1.0\n *\/\npublic class ExecutorConfig {\n    private static int maxPoolSize = Runtime.getRuntime().availableProcessors();\n    private volatile static ExecutorService executorService;\n    public static ExecutorService getThreadPool() {\n        if (executorService == null){\n            synchronized (ExecutorConfig.class){\n                if (executorService == null){\n                    executorService =  newThreadPool();\n                }\n            }\n        }\n        return executorService;\n    }\n\n    private static  ExecutorService newThreadPool(){\n        int queueSize = 500;\n        int corePool = Math.min(5, maxPoolSize);\n        return new ThreadPoolExecutor(corePool, maxPoolSize, 10000L, TimeUnit.MILLISECONDS,\n            new LinkedBlockingQueue&lt;&gt;(queueSize),new ThreadPoolExecutor.AbortPolicy());\n    }\n    private ExecutorConfig(){}\n}\n\/** \u83b7\u53d6sqlSession\n * @author 86182\n * @version V1.0\n *\/\n@Component\npublic class SqlContext {\n    @Resource\n    private SqlSessionTemplate sqlSessionTemplate;\n\n    public SqlSession getSqlSession(){\n        SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();\n        return sqlSessionFactory.openSession();\n    }\n}<\/code><\/pre>\n<p>\u63a8\u8350\u4e00\u4e2a Spring Boot \u57fa\u7840\u6559\u7a0b\u53ca\u5b9e\u6218\u793a\u4f8b\uff1a<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=ywo7eD1YYjRpwysi2arO3w%3D%3D.JTp3K4JRQ5ZWbsHiWQf3b0wBKZgGwMTTWI3mUTxpox9tW7O7C73XOKOOsk0qiFEsd9oC02nbtUonmxT7l1ma0A%3D%3D\" rel=\"noopener noreferrer\">https:\/\/github.com\/javastacks\/spring-boot-best-practice<\/a><\/p>\n<h2>\u793a\u4f8b\u4e8b\u52a1\u4e0d\u6210\u529f\u64cd\u4f5c<\/h2>\n<pre><code>  \/**\n * \u6d4b\u8bd5\u591a\u7ebf\u7a0b\u4e8b\u52a1.\n * @param employeeDOList\n *\/\n@Override\n@Transactional\npublic void saveThread(List&lt;EmployeeDO&gt; employeeDOList) {\n    try {\n        \/\/\u5148\u505a\u5220\u9664\u64cd\u4f5c,\u5982\u679c\u5b50\u7ebf\u7a0b\u51fa\u73b0\u5f02\u5e38,\u6b64\u64cd\u4f5c\u4e0d\u4f1a\u56de\u6eda\n        this.getBaseMapper().delete(null);\n        \/\/\u83b7\u53d6\u7ebf\u7a0b\u6c60\n        ExecutorService service = ExecutorConfig.getThreadPool();\n        \/\/\u62c6\u5206\u6570\u636e,\u62c6\u52065\u4efd\n        List&lt;List&lt;EmployeeDO&gt;&gt; lists=averageAssign(employeeDOList, 5);\n        \/\/\u6267\u884c\u7684\u7ebf\u7a0b\n        Thread []threadArray = new Thread[lists.size()];\n        \/\/\u76d1\u63a7\u5b50\u7ebf\u7a0b\u6267\u884c\u5b8c\u6bd5,\u518d\u6267\u884c\u4e3b\u7ebf\u7a0b,\u8981\u4e0d\u7136\u4f1a\u5bfc\u81f4\u4e3b\u7ebf\u7a0b\u5173\u95ed,\u5b50\u7ebf\u7a0b\u4e5f\u4f1a\u968f\u7740\u5173\u95ed\n        CountDownLatch countDownLatch = new CountDownLatch(lists.size());\n        AtomicBoolean atomicBoolean = new AtomicBoolean(true);\n        for (int i =0;i&lt;lists.size();i++){\n            if (i==lists.size()-1){\n                atomicBoolean.set(false);\n            }\n            List&lt;EmployeeDO&gt; list  = lists.get(i);\n            threadArray[i] =  new Thread(() -&gt; {\n                try {\n                 \/\/\u6700\u540e\u4e00\u4e2a\u7ebf\u7a0b\u629b\u51fa\u5f02\u5e38\n                    if (!atomicBoolean.get()){\n                        throw new ServiceException(&quot;001&quot;,&quot;\u51fa\u73b0\u5f02\u5e38&quot;);\n                    }\n                    \/\/\u6279\u91cf\u6dfb\u52a0,mybatisPlus\u4e2d\u81ea\u5e26\u7684batch\u65b9\u6cd5\n                    this.saveBatch(list);\n                }finally {\n                    countDownLatch.countDown();\n                }\n\n            });\n        }\n        for (int i = 0; i &lt;lists.size(); i++){\n            service.execute(threadArray[i]);\n        }\n        \/\/\u5f53\u5b50\u7ebf\u7a0b\u6267\u884c\u5b8c\u6bd5\u65f6,\u4e3b\u7ebf\u7a0b\u518d\u5f80\u4e0b\u6267\u884c\n        countDownLatch.await();\n        System.out.println(&quot;\u6dfb\u52a0\u5b8c\u6bd5&quot;);\n    }catch (Exception e){\n        log.info(&quot;error&quot;,e);\n        throw new ServiceException(&quot;002&quot;,&quot;\u51fa\u73b0\u5f02\u5e38&quot;);\n    }finally {\n         connection.close();\n     }\n}<\/code><\/pre>\n<p>\u6570\u636e\u5e93\u4e2d\u5b58\u5728\u4e00\u6761\u6570\u636e\uff1a<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"723\" height=\"84\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVc9O0e\" alt=\"\" title=\"\"><\/p>\n<p>Spring Boot \u57fa\u7840\u5c31\u4e0d\u4ecb\u7ecd\u4e86\uff0c\u63a8\u8350\u4e0b\u8fd9\u4e2a\u5b9e\u6218\u6559\u7a0b\uff1a<br \/><a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=Gevlf8pHOPNXQlkos%2Bwamg%3D%3D.kTBnxdBkDSp7rtaClQnawbJ9AFl%2B8MYf9UCgcs3kS6Vx%2B3%2BUsFKHdxJDb6iuqCuEnOYm0xAFRI9ikOvH0Srs1A%3D%3D\" rel=\"noopener noreferrer\">https:\/\/github.com\/javastacks\/spring-boot-best-practice<\/a><\/p>\n<pre><code>\/\/\u6d4b\u8bd5\u7528\u4f8b\n@RunWith(SpringRunner.class)\n@SpringBootTest(classes = { ThreadTest01.class, MainApplication.class})\npublic class ThreadTest01 {\n\n    @Resource\n    private EmployeeBO employeeBO;\n\n    \/**\n     *   \u6d4b\u8bd5\u591a\u7ebf\u7a0b\u4e8b\u52a1.\n     * @throws InterruptedException\n     *\/\n    @Test\n    public  void MoreThreadTest2() throws InterruptedException {\n        int size = 10;\n        List&lt;EmployeeDO&gt; employeeDOList = new ArrayList&lt;&gt;(size);\n        for (int i = 0; i&lt;size;i++){\n            EmployeeDO employeeDO = new EmployeeDO();\n            employeeDO.setEmployeeName(&quot;lol&quot;+i);\n            employeeDO.setAge(18);\n            employeeDO.setGender(1);\n            employeeDO.setIdNumber(i+&quot;XX&quot;);\n            employeeDO.setCreatTime(Calendar.getInstance().getTime());\n            employeeDOList.add(employeeDO);\n        }\n        try {\n            employeeBO.saveThread(employeeDOList);\n            System.out.println(&quot;\u6dfb\u52a0\u6210\u529f&quot;);\n        }catch (Exception e){\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/pre>\n<p>\u6d4b\u8bd5\u7ed3\u679c\uff1a<\/p>\n<p><img decoding=\"async\" width=\"723\" height=\"520\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVc9O0f\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p><img decoding=\"async\" width=\"723\" height=\"117\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVc9O0g\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u53ef\u4ee5\u53d1\u73b0\u5b50\u7ebf\u7a0b\u7ec4\u6267\u884c\u65f6\uff0c\u6709\u4e00\u4e2a\u7ebf\u7a0b\u6267\u884c\u5931\u8d25\uff0c\u5176\u4ed6\u7ebf\u7a0b\u4e5f\u4f1a\u629b\u51fa\u5f02\u5e38\uff0c\u4f46\u662f\u4e3b\u7ebf\u7a0b\u4e2d\u6267\u884c\u7684\u5220\u9664\u64cd\u4f5c\uff0c\u6ca1\u6709\u56de\u6eda\uff0c<code>@Transactional<\/code>\u6ce8\u89e3\u6ca1\u6709\u751f\u6548\u3002<\/p>\n<p>\u4f7f\u7528<code>sqlSession<\/code>\u63a7\u5236\u624b\u52a8\u63d0\u4ea4\u4e8b\u52a1<\/p>\n<pre><code> @Resource\n  SqlContext sqlContext;\n \/**\n * \u6d4b\u8bd5\u591a\u7ebf\u7a0b\u4e8b\u52a1.\n * @param employeeDOList\n *\/\n@Override\npublic void saveThread(List&lt;EmployeeDO&gt; employeeDOList) throws SQLException {\n    \/\/ \u83b7\u53d6\u6570\u636e\u5e93\u8fde\u63a5,\u83b7\u53d6\u4f1a\u8bdd(\u5185\u90e8\u81ea\u6709\u4e8b\u52a1)\n    SqlSession sqlSession = sqlContext.getSqlSession();\n    Connection connection = sqlSession.getConnection();\n    try {\n        \/\/ \u8bbe\u7f6e\u624b\u52a8\u63d0\u4ea4\n        connection.setAutoCommit(false);\n        \/\/\u83b7\u53d6mapper\n        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);\n        \/\/\u5148\u505a\u5220\u9664\u64cd\u4f5c\n        employeeMapper.delete(null);\n        \/\/\u83b7\u53d6\u6267\u884c\u5668\n        ExecutorService service = ExecutorConfig.getThreadPool();\n        List&lt;Callable&lt;Integer&gt;&gt; callableList  = new ArrayList&lt;&gt;();\n        \/\/\u62c6\u5206list\n        List&lt;List&lt;EmployeeDO&gt;&gt; lists=averageAssign(employeeDOList, 5);\n        AtomicBoolean atomicBoolean = new AtomicBoolean(true);\n        for (int i =0;i&lt;lists.size();i++){\n            if (i==lists.size()-1){\n                atomicBoolean.set(false);\n            }\n            List&lt;EmployeeDO&gt; list  = lists.get(i);\n            \/\/\u4f7f\u7528\u8fd4\u56de\u7ed3\u679c\u7684callable\u53bb\u6267\u884c,\n            Callable&lt;Integer&gt; callable = () -&gt; {\n                \/\/\u8ba9\u6700\u540e\u4e00\u4e2a\u7ebf\u7a0b\u629b\u51fa\u5f02\u5e38\n                if (!atomicBoolean.get()){\n                    throw new ServiceException(&quot;001&quot;,&quot;\u51fa\u73b0\u5f02\u5e38&quot;);\n                }\n              return employeeMapper.saveBatch(list);\n            };\n            callableList.add(callable);\n        }\n        \/\/\u6267\u884c\u5b50\u7ebf\u7a0b\n       List&lt;Future&lt;Integer&gt;&gt; futures = service.invokeAll(callableList);\n        for (Future&lt;Integer&gt; future:futures) {\n        \/\/\u5982\u679c\u6709\u4e00\u4e2a\u6267\u884c\u4e0d\u6210\u529f,\u5219\u5168\u90e8\u56de\u6eda\n            if (future.get()&lt;=0){\n                connection.rollback();\n                 return;\n            }\n        }\n        connection.commit();\n        System.out.println(&quot;\u6dfb\u52a0\u5b8c\u6bd5&quot;);\n    }catch (Exception e){\n        connection.rollback();\n        log.info(&quot;error&quot;,e);\n        throw new ServiceException(&quot;002&quot;,&quot;\u51fa\u73b0\u5f02\u5e38&quot;);\n    }finally {\n         connection.close();\n     }\n}\n\/\/ sql\n&lt;insert id=&quot;saveBatch&quot; parameterType=&quot;List&quot;&gt;\n INSERT INTO\n employee (employee_id,age,employee_name,birth_date,gender,id_number,creat_time,update_time,status)\n values\n     &lt;foreach collection=&quot;list&quot; item=&quot;item&quot; index=&quot;index&quot; separator=&quot;,&quot;&gt;\n     (\n     #{item.employeeId},\n     #{item.age},\n     #{item.employeeName},\n     #{item.birthDate},\n     #{item.gender},\n     #{item.idNumber},\n     #{item.creatTime},\n     #{item.updateTime},\n     #{item.status}\n         )\n     &lt;\/foreach&gt;\n &lt;\/insert&gt;<\/code><\/pre>\n<p>\u6570\u636e\u5e93\u4e2d\u4e00\u6761\u6570\u636e\uff1a<\/p>\n<p><img decoding=\"async\" width=\"723\" height=\"130\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVc9O0h\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u6d4b\u8bd5\u7ed3\u679c\uff1a\u629b\u51fa\u5f02\u5e38\uff0c<\/p>\n<p><img decoding=\"async\" width=\"723\" height=\"143\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVc9O0i\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u5220\u9664\u64cd\u4f5c\u7684\u6570\u636e\u56de\u6eda\u4e86\uff0c\u6570\u636e\u5e93\u4e2d\u7684\u6570\u636e\u4f9d\u65e7\u5b58\u5728\uff0c\u8bf4\u660e\u4e8b\u52a1\u6210\u529f\u4e86\u3002<\/p>\n<p><img decoding=\"async\" width=\"723\" height=\"84\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVc9O0j\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p><strong>\u6210\u529f\u64cd\u4f5c\u793a\u4f8b\uff1a<\/strong><\/p>\n<pre><code> @Resource\nSqlContext sqlContext;\n\/**\n * \u6d4b\u8bd5\u591a\u7ebf\u7a0b\u4e8b\u52a1.\n * @param employeeDOList\n *\/\n@Override\npublic void saveThread(List&lt;EmployeeDO&gt; employeeDOList) throws SQLException {\n    \/\/ \u83b7\u53d6\u6570\u636e\u5e93\u8fde\u63a5,\u83b7\u53d6\u4f1a\u8bdd(\u5185\u90e8\u81ea\u6709\u4e8b\u52a1)\n    SqlSession sqlSession = sqlContext.getSqlSession();\n    Connection connection = sqlSession.getConnection();\n    try {\n        \/\/ \u8bbe\u7f6e\u624b\u52a8\u63d0\u4ea4\n        connection.setAutoCommit(false);\n        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);\n        \/\/\u5148\u505a\u5220\u9664\u64cd\u4f5c\n        employeeMapper.delete(null);\n        ExecutorService service = ExecutorConfig.getThreadPool();\n        List&lt;Callable&lt;Integer&gt;&gt; callableList  = new ArrayList&lt;&gt;();\n        List&lt;List&lt;EmployeeDO&gt;&gt; lists=averageAssign(employeeDOList, 5);\n        for (int i =0;i&lt;lists.size();i++){\n            List&lt;EmployeeDO&gt; list  = lists.get(i);\n            Callable&lt;Integer&gt; callable = () -&gt; employeeMapper.saveBatch(list);\n            callableList.add(callable);\n        }\n        \/\/\u6267\u884c\u5b50\u7ebf\u7a0b\n       List&lt;Future&lt;Integer&gt;&gt; futures = service.invokeAll(callableList);\n        for (Future&lt;Integer&gt; future:futures) {\n            if (future.get()&lt;=0){\n                connection.rollback();\n                 return;\n            }\n        }\n        connection.commit();\n        System.out.println(&quot;\u6dfb\u52a0\u5b8c\u6bd5&quot;);\n    }catch (Exception e){\n        connection.rollback();\n        log.info(&quot;error&quot;,e);\n        throw new ServiceException(&quot;002&quot;,&quot;\u51fa\u73b0\u5f02\u5e38&quot;);\n       \/\/ throw new ServiceException(ExceptionCodeEnum.EMPLOYEE_SAVE_OR_UPDATE_ERROR);\n    }\n}<\/code><\/pre>\n<p>\u6d4b\u8bd5\u7ed3\u679c\uff1a<\/p>\n<p><img decoding=\"async\" width=\"723\" height=\"124\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVc9O0k\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<p>\u6570\u636e\u5e93\u4e2d\u6570\u636e\uff1a<\/p>\n<p>\u5220\u9664\u7684\u5220\u9664\u4e86\uff0c\u6dfb\u52a0\u7684\u6dfb\u52a0\u6210\u529f\u4e86\uff0c\u6d4b\u8bd5\u6210\u529f\u3002<\/p>\n<p><img decoding=\"async\" width=\"723\" height=\"236\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVc9O0o\" alt=\"\" title=\"\" loading=\"lazy\"><\/p>\n<blockquote><p>\u7248\u6743\u58f0\u660e\uff1a\u672c\u6587\u4e3aCSDN\u535a\u4e3b\u300cweixin_43225491\u300d\u7684\u539f\u521b\u6587\u7ae0\uff0c\u9075\u5faaCC 4.0 BY-SA\u7248\u6743\u534f\u8bae\uff0c\u8f6c\u8f7d\u8bf7\u9644\u4e0a\u539f\u6587\u51fa\u5904\u94fe\u63a5\u53ca\u672c\u58f0\u660e\u3002\u539f\u6587\u94fe\u63a5\uff1a<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=Y6EsV6ncNOIWq2Fed4r5FQ%3D%3D.t9xWfuxQNUfRl0ueqiopRU3yDszxm36PvDKh5iVk9nfdw0wnxPm1MK72ZolNrK%2FNaivDrhbAC19hvRKH2o%2BoRQ%3D%3D\" rel=\"noopener noreferrer\">https:\/\/blog.csdn.net\/weixin_43225491\/article\/details\/117705686<\/a><\/p><\/blockquote>\n<p><strong>\u8fd1\u671f\u70ed\u6587\u63a8\u8350\uff1a<\/strong><\/p>\n<p>1.<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=J31R97%2F0EZXqX%2BiJReRvDw%3D%3D.uNQGCxpSmTzHWSYl%2BAoOtQuGlbHkWkuaUoKwV4OFbrU%3D\" rel=\"noopener noreferrer\">1,000+ \u9053 Java\u9762\u8bd5\u9898\u53ca\u7b54\u6848\u6574\u7406(2022\u6700\u65b0\u7248)<\/a><\/p>\n<p>2.<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=S8kft791QFYytfVXKYse5A%3D%3D.DuX7PI4Q6ULusmrNIK9f4o2cZMpcofIRXLvT2xISBeCbAbN4el23tQJJ%2BqvFhIbdx%2FkqL6kbTqlvlMXjrEsqYw%3D%3D\" rel=\"noopener noreferrer\">\u52b2\u7206\uff01Java \u534f\u7a0b\u8981\u6765\u4e86\u3002\u3002\u3002<\/a><\/p>\n<p>3.<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=Le3lZ2NVk4j%2FZc8ZqXNmsA%3D%3D.q51w5GXNknvEW44yGVGySdxBZucQKdzclssN%2F7S2X6aI2REozDt4MBw52BBLEHOt\" rel=\"noopener noreferrer\">Spring Boot 2.x \u6559\u7a0b\uff0c\u592a\u5168\u4e86\uff01<\/a><\/p>\n<p>4.<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=BXIue3LPzMaWfAsgy%2FaxYw%3D%3D.luyn%2B69N%2FkAURmuVihrR0f5zkQxZ4hSlsuOwXcm%2BrYhv3oK5BOXHsMKVe%2FzjR%2BO7blk8eC3ndey6FTPUittKAA%3D%3D\" rel=\"noopener noreferrer\">\u522b\u518d\u5199\u6ee1\u5c4f\u7684\u7206\u7206\u7206\u70b8\u7c7b\u4e86\uff0c\u8bd5\u8bd5\u88c5\u9970\u5668\u6a21\u5f0f\uff0c\u8fd9\u624d\u662f\u4f18\u96c5\u7684\u65b9\u5f0f\uff01\uff01<\/a><\/p>\n<p>5.<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=LuLXHEYZ2yE%2BiLadXk0m5Q%3D%3D.qnGcfU%2B4XvoeUot3mhgbDAdL3YTtkK%2Ffdqxuk4aZvgro6Vz8wMj5gocjhtLzMgqoDYGwU9cVf0uR8mbRHde0RSvBmVv3qIgMKfX%2F8PbB93s%3D\" rel=\"noopener noreferrer\">\u300aJava\u5f00\u53d1\u624b\u518c\uff08\u5d69\u5c71\u7248\uff09\u300b\u6700\u65b0\u53d1\u5e03\uff0c\u901f\u901f\u4e0b\u8f7d\uff01<\/a><\/p>\n<p>\u89c9\u5f97\u4e0d\u9519\uff0c\u522b\u5fd8\u4e86\u968f\u624b\u70b9\u8d5e+\u8f6c\u53d1\u54e6\uff01<\/p>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000044247679\">https:\/\/segmentfault.com\/a\/1190000044247679<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u80cc\u666f\u4ecb\u7ecd 1\uff0c\u6700\u8fd1\u6709\u4e00\u4e2a\u5927\u6570\u636e\u91cf\u63d2\u5165\u7684\u64cd\u4f5c\u5165\u5e93\u7684\u4e1a\u52a1\u573a\u666f\uff0c\u9700\u8981\u5148\u505a\u4e00\u4e9b\u5176\u4ed6\u4fee\u6539\u64cd\u4f5c\uff0c\u7136\u540e\u5728\u6267\u884c\u63d2\u5165\u64cd\u4f5c\uff0c\u7531\u4e8e\u63d2 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-10008316","post","type-post","status-publish","format-standard","hentry","category-share"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10008316","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10008316"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10008316\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10008316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10008316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10008316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}