ssm項(xiàng)目改造spring?boot項(xiàng)目完整步驟
快速創(chuàng)建 Spring Boot 項(xiàng)目
添加依賴
如果是普通 Maven 項(xiàng)目,需要手動(dòng)添加。
<!-- 打包方式 jar 包 --> <packaging>jar</packaging> <!-- 指定父工程 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> </parent> <dependencies> <!-- spring boot Web 包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- spring boot Test 包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> </dependencies>
添加啟動(dòng)類
如果是普通 Maven 項(xiàng)目,需要手動(dòng)添加。
@SpringBootApplication public class xxxApplication { public static void main(String[] args) { SpringApplication.run(xxxApplication.class, args); } }
拷貝項(xiàng)目代碼
- 把 src\main\java 中的 java 代碼全部拷貝到新項(xiàng)目中的 src\main\java 里面。
- 把 src\main\resources 中存放 mapper.xml 的目錄也拷貝到新項(xiàng)目中的 src\main\resources 里面。
下面步驟用什么拷貝什么
配置數(shù)據(jù)庫(kù)連接池
添加依賴
<!-- MySQL 驅(qū)動(dòng) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
還需要jdbc依賴(事務(wù))
連接池的自動(dòng)配置方式
application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql:///數(shù)據(jù)庫(kù)庫(kù)名?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=admin
此時(shí)運(yùn)行測(cè)試獲取的數(shù)據(jù)庫(kù)連接池對(duì)象可以執(zhí)行成功,并且我們看到了使用的連接池是 Hikari,全稱是 Hikaricp。
其實(shí),在 Spring Boot 2.0 之后,采用的默認(rèn)連接池就是 Hikari,號(hào)稱“史上最快的連接池”,所以我們沒(méi)有添加依賴也能直接用,Spring Boot 的自動(dòng)配置中含有 DataSourceAutoConfiguration 配置類,會(huì)先檢查容器中是否已經(jīng)有連接池對(duì)象,沒(méi)有則會(huì)使用默認(rèn)的連接池,并根據(jù)特定的屬性來(lái)自動(dòng)配置連接池對(duì)象,用到的屬性值來(lái)源于DataSourceProperties 對(duì)象。
配置 Druid 連接池
當(dāng)然如果我們?cè)陧?xiàng)目中還是想要使用 Druid 作為連接池也是可以的。只需要添加依賴即可,此時(shí)加的是 Druid 的 druid-spring-boot-starter 自動(dòng)配置包, 里面包含了 DruidDataSourceAutoConfigure 自動(dòng)配置類,會(huì)自動(dòng)創(chuàng)建 Druid 的連接池對(duì)象,所以 Spring Boot 發(fā)現(xiàn)已經(jīng)有連接池對(duì)象了,則不會(huì)再使用 Hikari。
<!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.21</version> </dependency>
注意:如果添加的依賴是以前那種普通包,只有 Druid 自身的依賴,并不是自動(dòng)配置包,則需要進(jìn)行以下配置:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.19</version> </dependency>
在配置文件中添加參數(shù)
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
所以一般如果已經(jīng)提供了 Spring Boot 相關(guān)的自動(dòng)配置包,直接使用自動(dòng)配置的會(huì)更方便些。
對(duì)于 Hikari 以及 Druid 兩款都是開(kāi)源產(chǎn)品,阿里的 Druid 有中文的開(kāi)源社區(qū),交流起來(lái)更加方便,并且經(jīng)過(guò)阿里多個(gè)系統(tǒng)的實(shí)驗(yàn),也是非常的穩(wěn)定,而 Hikari 是 Spring Boot 2.0 默認(rèn)的連接池,全世界使用范圍也非常廣,對(duì)于大部分業(yè)務(wù)來(lái)說(shuō),使用哪一款都是差不多的,畢竟性能瓶頸一般都不在連接池。
集成 MyBatis
添加依賴
<!-- Mybatis 集成到 SpringBoot 中的依賴 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency>
配置 Mapper 對(duì)象
掃描 Mapper 接口只要在任意配置類上貼個(gè)注解 @MapperScan
并指定掃描的包路徑即可。
@SpringBootApplication @MapperScan("cn.xxx.mapper") public class SsmApplication { public static void main(String[] args) { SpringApplication.run(SsmApplication.class, args); } }
MyBatis配置屬性
在 application.properties 配置以前在 XML 配置了的那些 MyBatis 的屬性,屬性前綴 mybatis。
# 配置別名 mybatis.type-aliases-package=cn.xxx.domain # 打印 SQL 日志 logging.level.cn.xxx.mapper=trace
事務(wù)管理
添加依賴
<!-- Spring JDBC 和 TX --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
注解方式
直接在業(yè)務(wù)層實(shí)現(xiàn)類上或者其方法上直接貼 @Transactional
注解即可。
Spring Boot 自動(dòng)配置中提供了 TransactionAutoConfiguration 事務(wù)注解自動(dòng)配置類,引入了事務(wù)的依賴后,可直接使用 @Transactional
注解。
配置切換代理
Spring Boot 默認(rèn)優(yōu)先選擇 CGLIB 代理,如果需要改為優(yōu)先使用 JDK 代理,需要做以下配置:
spring.aop.proxy-target-class=false
測(cè)試驗(yàn)證
在測(cè)試類上添加方法,打印業(yè)務(wù)對(duì)象看下其真實(shí)類型。
@Test public void testSave() { System.out.println(departmentService.getClass()); }
集成 Web
添加依賴
<!-- spring boot web 啟動(dòng)器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
修改端口
在 application.properties 配置,如下:
server.port=80
目錄結(jié)構(gòu)
拷貝靜態(tài)資源及模板文件
靜態(tài)資源的一些處理
- 默認(rèn)情況下,Spring Boot 會(huì)從 classpath 下的 /static,/public,/resources,/META-INF/resources 下加載靜態(tài)資源。
- 可以在 application.properties 中配置 spring.resources.staticLocations 屬性來(lái)修改靜態(tài)資源的默認(rèn)加載地址。
- 因?yàn)閼?yīng)用是打成 jar 包,所以之前的 src/main/webapp 就作廢了,如果有文件上傳,那么就的必須去配置圖片保存的路徑,因?yàn)閳D片不能存在jar包中,之前war包方式才可以。
# 告訴 Spring Boot 必須要以怎樣的路徑開(kāi)頭才能訪問(wèn)到靜態(tài)資源,這樣做是為了后期如果需要攔截,攔截器可以統(tǒng)一排除掉這些以這個(gè)開(kāi)頭的訪問(wèn) spring.mvc.static-path-pattern=/static/**
前端控制器映射路徑配置
在 Spring Boot 自動(dòng)配置中,WebMvcAutoConfiguration 自動(dòng)配置類導(dǎo)入了 DispatcherServletAutoConfiguration 配置對(duì)象,會(huì)自動(dòng)創(chuàng)建 DispatcherServlet 前端控制器,默認(rèn)的映射路徑是 /,Spring Boot 多數(shù)用于前后端分離和微服務(wù)開(kāi)發(fā),默認(rèn)支持 RESTFul 風(fēng)格,所以一般都是使用默認(rèn)的即可,不做改動(dòng)。
# 在匹配模式時(shí)是否使用后綴模式匹配(嚴(yán)格匹配后綴)一般前后端分離做嚴(yán)格區(qū)分時(shí)配置 spring.mvc.pathmatch.use-suffix-pattern=true
集成 Thymeleaf
添加依賴
<!-- 引入 Thymeleaf 依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
相關(guān)配置
# Thymelea 模板配置 spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML spring.thymeleaf.encoding=UTF-8 # 上面幾個(gè)配置都是默認(rèn)值不需要配置 # 熱部署文件,頁(yè)面不產(chǎn)生緩存,及時(shí)更新(開(kāi)發(fā)時(shí)禁用緩存) spring.thymeleaf.cache=false
修改模板文件
使用 Thymeleaf 的語(yǔ)法替換之前 JSP 中的 EL 表達(dá)式和 JSTL。
統(tǒng)一異常處理
框架自帶方式
Spring Boot 默認(rèn)情況下,會(huì)把所有錯(cuò)誤都交給 BasicErrorController 類完成處理,錯(cuò)誤的視圖我們放到 classpath:/static/error/ 和 classpath:/templates/error/ 路徑上,HTTP 錯(cuò)誤狀態(tài)碼就是默認(rèn)視圖的名稱。如:
- 出現(xiàn) 404 錯(cuò)誤 -> classpath:/static/error/404.html
- 出現(xiàn) 5xx 錯(cuò)誤 -> classpath:/static/error/5xx.html (因?yàn)?5xx 錯(cuò)誤是后臺(tái)錯(cuò)誤, 原因很多種, 有時(shí)有需求需要根據(jù)原因不一樣響應(yīng)不同的內(nèi)容, 甚至響應(yīng)數(shù)據(jù)格式都不一樣,所以我們一般都用統(tǒng)一異常處理,然后再根據(jù)錯(cuò)誤原因把對(duì)應(yīng)內(nèi)容放到頁(yè)面上)
控制器增強(qiáng)器方式
自己定義一個(gè)控制器增強(qiáng)器,專門用于統(tǒng)一異常處理,該方式一般用于處理 5xx 類錯(cuò)誤。
@ControllerAdvice // 控制器消息,這個(gè)注解為了spring幫我們創(chuàng)建對(duì)象 public class ExceptionControllerAdvice { @ExceptionHandler(RuntimeException.class) // 處理什么類型的異常 //返回值形式也可以自定義,可以返回modelAndView, public String handlException(RuntimeException e, Model model,HandlerMethod m) { //HandlerMethod這個(gè)對(duì)象存放了spring對(duì)控制器的方法和控制器對(duì)象 //將錯(cuò)誤信息存入到model中 e.printStackTrace(); // 記得這行代碼保留,不然項(xiàng)目后臺(tái)出異常,開(kāi)發(fā)工具控制臺(tái)看不到錯(cuò)誤信息 return "errorView"; // 指定錯(cuò)誤頁(yè)面視圖名稱,然后在頁(yè)面從model對(duì)象中拿到錯(cuò)誤信息 } }
添加注冊(cè)多個(gè)攔截器
定義一個(gè)配置類,實(shí)現(xiàn) WebMvcConfigurer 接口,在 addInterceptors 方法注冊(cè)攔截器。
@Configuration public class MvcJavaConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; //攔截器類實(shí)現(xiàn)HandlerInterceptor @Autowired private PermissionInterceptor permissionInterceptor; //攔截器類實(shí)現(xiàn)HandlerInterceptor public void addInterceptors(InterceptorRegistry registry) { // 注冊(cè)登錄攔截器 registry.addInterceptor(loginInterceptor) // 對(duì)哪些資源起過(guò)濾作用 .addPathPatterns("/**") // 對(duì)哪些資源起排除作用 .excludePathPatterns("/login", "/static/**");//多個(gè)路徑 //多個(gè)攔截器 // 注冊(cè)權(quán)限攔截器 registry.addInterceptor(permissionInterceptor) // 對(duì)哪些資源起過(guò)濾作用 .addPathPatterns("/**") // 對(duì)哪些資源起排除作用 .excludePathPatterns("/login", "/static/**"); } }
系統(tǒng)日志
為什么要用日志
- 比起 System.out.println,日志框架更為靈活,可以把日志的輸出和代碼分離。
- 日志框架可以方便的定義日志的輸出環(huán)境,控制臺(tái),文件,數(shù)據(jù)庫(kù)。
- 日志框架可以方便的定義日志的輸出格式和輸出級(jí)別。
Spring Boot 中的日志介紹
- Spring Boot 默認(rèn)已經(jīng)開(kāi)啟日志,其默認(rèn)的日志格式為:時(shí)間 日志級(jí)別 線程ID 線程名稱 日志類 日志說(shuō)明。
- Spring Boot 的日志分為:系統(tǒng)日志和應(yīng)用日志。
- 日志級(jí)別,級(jí)別越高,輸出的內(nèi)容越少,如果設(shè)置的級(jí)別為 info,則 debug 以及 trace 級(jí)別的都無(wú)法顯示,日志級(jí)別由低到高 trace < debug < info < warn < error。
- Spring Boot 默認(rèn)選擇 Logback 作為日志框架,也能選擇其他日志框架,但是沒(méi)有必要。
由于slf4j是后來(lái)出現(xiàn)的日志標(biāo)準(zhǔn),目的是統(tǒng)一之前很多日志框架的使用方式,對(duì)主流的日志框架主動(dòng)的實(shí)現(xiàn)了這個(gè)標(biāo)準(zhǔn),實(shí)際就是調(diào)用各日志框架的api
輸出日志
在我們自定義的類中可以使用日志框架來(lái)輸出。
方式一
在類中注入一個(gè)靜態(tài) Logger 對(duì)象,傳入當(dāng)前類的作用是方便輸出日志時(shí)可以清晰地看到該日志信息是屬于哪個(gè)類的。
private static final Logger log = LoggerFactory.getLogger(當(dāng)前類.class);
方式二
使用 Lombok 提供的 @Slf4j 注解來(lái)簡(jiǎn)化代碼,其實(shí)和方式一的作用是一樣的。
@Slf4j @Service public class PermissionServiceImpl implements IPermissionService {}
在需要輸出日志的地方使用日志的輸出方法
log.info(...); log.error(...); ... // 輸出日志中有變量可以使用 {} 作為占位符 log.info("刪除id為{}的數(shù)據(jù)", id);
日志級(jí)別
日志級(jí)別由低到高 trace < debug < info < warn < error。
log.debug("權(quán)限插入成功:{}",expression); log.info("權(quán)限插入成功:{}",expression); log.warn("權(quán)限插入成功:{}",expression);
執(zhí)行權(quán)限加載功能后,發(fā)現(xiàn)控制臺(tái)出現(xiàn) info 與 warn 的信息,debug 的沒(méi)有顯示,原因是因?yàn)?Spring Boot 默認(rèn)的日志級(jí)別是 info,所以 debug 低于 info 級(jí)別,就不會(huì)顯示出來(lái)了。
若要修改日志顯示級(jí)別,最快速的方式是在 application.properties 配置,配置如下
# 把日志級(jí)別修改為 debug,不過(guò)我們一般不會(huì)更改,除非要調(diào)試找 bug,不然控制臺(tái)顯示的內(nèi)容太多也容易亂,下面為全局配置,單路徑配置如打印 SQL 日志 logging.level.cn.xxx.mapper=trace logging.level.root=debug
Logback 配置文件,日志存入文件中
Logback 框架默認(rèn)會(huì)自動(dòng)加載 classpath:logback.xml,作為框架的配置文件,在 Spring Boot項(xiàng)目中使用時(shí),還會(huì)額外的支持自動(dòng)加載classpath:logback-spring.xml,在 Spring Boot 項(xiàng)目中推薦使用 logback-spring.xml,功能更強(qiáng)大些。
<?xml version="1.0" encoding="UTF-8"?> <!-- scan:開(kāi)啟日志框架的熱部署,默認(rèn)值 true 表示開(kāi)啟 scanPeriod:熱部署的頻率,默認(rèn)值 60 second debug:設(shè)置輸出框架內(nèi)部的日志,默認(rèn)值 false --> <configuration scan="true" scanPeriod="60 second" debug="false"> <property name="appName" value="springboot demo" /> <contextName>${appName}</contextName> <!-- appender:日志輸出對(duì)象,配置不同的類擁有不同的功能 ch.qos.logback.core.ConsoleAppender:日志輸出到控制臺(tái) --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd-HH:mm:ss} %level [%thread]-%logger{35} >> %msg %n</pattern> </encoder> </appender> <!-- ch.qos.logback.core.FileAppender:日志輸出到文件中--> <appender name="fileAppender" class="ch.qos.logback.core.FileAppender"> <encoder> <pattern>%-4relative [%thread] %level %logger{35} - %msg %n</pattern> </encoder> <append>true</append> <!-- 是否為在原有文件追加內(nèi)容方式--> <file>MyLog.log</file> <!-- 日志存放的文件,也可以指定路徑 --> </appender> <!-- root 是項(xiàng)目通用的 logger,一般情況下都是使用 root 配置的日志輸出 level:按照級(jí)別輸出日志,日志級(jí)別,級(jí)別越高,輸出的內(nèi)容越少 --> <root level="info"> <appender-ref ref="STDOUT" /> <!-- 日志輸出到控制臺(tái)還是存入文件中 --> </root> <!-- 自定義的 logger,用于專門輸出特定包中打印的日志 <logger name="cn.xxx.crm.mapper" level="trace"> </logger> --> </configuration>
參考日志格式:
- %d{yyyy-MM-dd-HH:mm:ss} %level [%thread]-%class:%line >> %msg %n
格式中的標(biāo)識(shí)符組成:
- %logger{n}:輸出 Logger 對(duì)象類名,n 代表長(zhǎng)度
- %class{n}:輸出所在類名
- %d{pattern} 或者 date{pattern}:輸出日志日期,格式同 Java
- %L/line:日志所在行號(hào)
- %m/msg:日志內(nèi)容
- %method:所在方法名稱
- %p/level:日志級(jí)別
- %thread:所在線程名稱
一般開(kāi)發(fā)過(guò)程,日志記錄到控制臺(tái)
實(shí)際上線了, 日志一般記錄到文件中
其他功能
修改spring boot啟動(dòng)打印畫(huà)面
Spring Boot 提供了一些擴(kuò)展點(diǎn),比如修改 banner:在 resources 根目錄中放入 banner.txt 文件,替換默認(rèn)的啟動(dòng)spring打印的字樣。
# application.properties # 關(guān)閉 banner spring.main.banner-mode=off
熱部署插件
除了使用 JRebel 插件(收費(fèi))來(lái)實(shí)現(xiàn)熱部署,還可以使用 Spring Boot 提供的 spring-boot-devtools 包來(lái)完成 Springboot 應(yīng)用熱部署,從而實(shí)現(xiàn)更改方法內(nèi)代碼和模板文件不需要重啟,只需要點(diǎn)擊編譯即可。
<!-- Spring Boot 熱部署插件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
Spring Boot 重啟是 reload 重啟,通過(guò)監(jiān)控 classpath 的變化,如果 classpath 中的文件發(fā)生變化,即觸發(fā)重啟。Spring Boot 通過(guò)兩個(gè) classpath 來(lái)完成 reload,一個(gè) basic classloader 中加載不變的類(jar 包中的類),一個(gè) restart classloader 中加載 classpath 中的類(自己寫(xiě)的類),重啟的時(shí)候,restart classloader 中的類丟棄并重新加載。
下面是相關(guān)的一些配置,一般不用配置
# 默認(rèn)排除不需要更新的資源 spring.devtools.restart.exclude=static/**,templates/**,public/** # 增加額外的排除資源 # 處理默認(rèn)配置排除之外的 spring.devtools.restart.additional-exclude=public/** # 禁用自動(dòng)重啟 spring.devtools.restart.enabled=false
切換運(yùn)行環(huán)境
在實(shí)際開(kāi)發(fā)中,一個(gè)系統(tǒng)是有多套運(yùn)行環(huán)境的,如開(kāi)發(fā)時(shí)有開(kāi)發(fā)的環(huán)境,測(cè)試時(shí)有測(cè)試的環(huán)境,不同的環(huán)境中,系統(tǒng)的參數(shù)設(shè)置是不同的,如:連接開(kāi)發(fā)數(shù)據(jù)和測(cè)試數(shù)據(jù)庫(kù)的 URL 絕對(duì)是不同的,那么怎么快速的切換系統(tǒng)運(yùn)行的環(huán)境呢?我們需要為不同的環(huán)境創(chuàng)建不同的配置文件,如下:
# application-dev.properties server.port=8081
# application-test.properties server.port=8082
最后我們?cè)?application.properties 中指定需要使用的環(huán)境即可
# 在 application.properties 中指定需要使用的環(huán)境即可 spring.profiles.active=dev
在命令行模式下啟動(dòng)也可以激活: java -jar xxx --spring.profiles.active=dev
總結(jié)
到此這篇關(guān)于ssm項(xiàng)目改造spring boot項(xiàng)目的文章就介紹到這了,更多相關(guān)ssm改造spring boot項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解mybatis collection標(biāo)簽一對(duì)多的使用
這篇文章主要介紹了mybatis collection標(biāo)簽一對(duì)多的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06SpringBoot實(shí)現(xiàn)發(fā)送郵件功能
這篇文章主要介紹了SpringBoot 發(fā)送郵件功能實(shí)現(xiàn),本文以163郵箱為例通過(guò)這個(gè)小案例給大家介紹,需要的朋友可以參考下2019-12-12關(guān)于Integer.parseInt()方法的使用
這篇文章主要介紹了關(guān)于Integer.parseInt()方法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11IDEA SSM整合Redis項(xiàng)目實(shí)例 附源碼
今天給大家普及IDEA SSM整合Redis項(xiàng)目實(shí)例,包括pom.xml 配置和spring-redis.xml 配置代碼,代碼也很簡(jiǎn)單,通過(guò)項(xiàng)目實(shí)際案例能更好的幫助大家理解,需要的朋友可以參考下2021-06-06Java 創(chuàng)建兩個(gè)線程模擬對(duì)話并交替輸出實(shí)現(xiàn)解析
這篇文章主要介紹了Java 創(chuàng)建兩個(gè)線程模擬對(duì)話并交替輸出實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10MyBatis?詳細(xì)講解動(dòng)態(tài)?SQL的使用
動(dòng)態(tài)?SQL?是?MyBatis?的強(qiáng)大特性之一。如果你使用過(guò)?JDBC?或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接?SQL?語(yǔ)句有多痛苦,例如拼接時(shí)要確保不能忘記添加必要的空格,還要注意去掉列表最后一個(gè)列名的逗號(hào)。利用動(dòng)態(tài)?SQL,可以徹底擺脫這種痛苦2022-04-04Spring?Cloud灰度部署實(shí)現(xiàn)過(guò)程詳解
這篇文章主要為大家介紹了Spring?Cloud灰度部署實(shí)現(xiàn)過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Mybatis實(shí)現(xiàn)動(dòng)態(tài)增刪改查功能的示例代碼
這篇文章主要介紹了Mybatis實(shí)現(xiàn)動(dòng)態(tài)增刪改查功能的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Java實(shí)現(xiàn)PDF轉(zhuǎn)為線性PDF詳解
線性化PDF文件是PDF文件的一種特殊格式,可以通過(guò)Internet更快地進(jìn)行查看。本文將通過(guò)后端Java程序?qū)崿F(xiàn)將PDF文件轉(zhuǎn)為線性化PDF。感興趣的可以了解一下2021-12-12