<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
快速建立 Spring Boot 專案
如果是普通 Maven 專案,需要手動新增。
<!-- 打包方式 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>
如果是普通 Maven 專案,需要手動新增。
@SpringBootApplication public class xxxApplication { public static void main(String[] args) { SpringApplication.run(xxxApplication.class, args); } }
下面步驟用什麼拷貝什麼
<!-- MySQL 驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
還需要jdbc依賴(事務)
application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql:///資料庫庫名?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 spring.datasource.username=root spring.datasource.password=admin
此時執行測試獲取的資料庫連線池物件可以執行成功,並且我們看到了使用的連線池是 Hikari,全稱是 Hikaricp。
其實,在 Spring Boot 2.0 之後,採用的預設連線池就是 Hikari,號稱“史上最快的連線池”,所以我們沒有新增依賴也能直接用,Spring Boot 的自動設定中含有 DataSourceAutoConfiguration 設定類,會先檢查容器中是否已經有連線池物件,沒有則會使用預設的連線池,並根據特定的屬性來自動設定連線池物件,用到的屬性值來源於DataSourceProperties 物件。
當然如果我們在專案中還是想要使用 Druid 作為連線池也是可以的。只需要新增依賴即可,此時加的是 Druid 的 druid-spring-boot-starter 自動設定包, 裡面包含了 DruidDataSourceAutoConfigure 自動設定類,會自動建立 Druid 的連線池物件,所以 Spring Boot 發現已經有連線池物件了,則不會再使用 Hikari。
<!-- druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.21</version> </dependency>
注意:如果新增的依賴是以前那種普通包,只有 Druid 自身的依賴,並不是自動設定包,則需要進行以下設定:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.19</version> </dependency>
在組態檔中新增引數
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
所以一般如果已經提供了 Spring Boot 相關的自動設定包,直接使用自動設定的會更方便些。
對於 Hikari 以及 Druid 兩款都是開源產品,阿里的 Druid 有中文的開源社群,交流起來更加方便,並且經過阿里多個系統的實驗,也是非常的穩定,而 Hikari 是 Spring Boot 2.0 預設的連線池,全世界使用範圍也非常廣,對於大部分業務來說,使用哪一款都是差不多的,畢竟效能瓶頸一般都不在連線池。
<!-- Mybatis 整合到 SpringBoot 中的依賴 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency>
掃描 Mapper 介面只要在任意設定類上貼個註解 @MapperScan
並指定掃描的包路徑即可。
@SpringBootApplication @MapperScan("cn.xxx.mapper") public class SsmApplication { public static void main(String[] args) { SpringApplication.run(SsmApplication.class, args); } }
在 application.properties 設定以前在 XML 設定了的那些 MyBatis 的屬性,屬性字首 mybatis。
# 設定別名 mybatis.type-aliases-package=cn.xxx.domain # 列印 SQL 紀錄檔 logging.level.cn.xxx.mapper=trace
<!-- Spring JDBC 和 TX --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
直接在業務層實現類上或者其方法上直接貼 @Transactional
註解即可。
Spring Boot 自動設定中提供了 TransactionAutoConfiguration 事務註解自動設定類,引入了事務的依賴後,可直接使用 @Transactional
註解。
Spring Boot 預設優先選擇 CGLIB 代理,如果需要改為優先使用 JDK 代理,需要做以下設定:
spring.aop.proxy-target-class=false
在測試類上新增方法,列印業務物件看下其真實型別。
@Test public void testSave() { System.out.println(departmentService.getClass()); }
<!-- spring boot web 啟動器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
在 application.properties 設定,如下:
server.port=80
拷貝靜態資源及模板檔案
# 告訴 Spring Boot 必須要以怎樣的路徑開頭才能存取到靜態資源,這樣做是為了後期如果需要攔截,攔截器可以統一排除掉這些以這個開頭的存取 spring.mvc.static-path-pattern=/static/**
在 Spring Boot 自動設定中,WebMvcAutoConfiguration 自動設定類匯入了 DispatcherServletAutoConfiguration 設定物件,會自動建立 DispatcherServlet 前端控制器,預設的對映路徑是 /,Spring Boot 多數用於前後端分離和微服務開發,預設支援 RESTFul 風格,所以一般都是使用預設的即可,不做改動。
# 在匹配模式時是否使用字尾模式匹配(嚴格匹配字尾)一般前後端分離做嚴格區分時設定 spring.mvc.pathmatch.use-suffix-pattern=true
<!-- 引入 Thymeleaf 依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
# Thymelea 模板設定 spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML spring.thymeleaf.encoding=UTF-8 # 上面幾個設定都是預設值不需要設定 # 熱部署檔案,頁面不產生快取,及時更新(開發時禁用快取) spring.thymeleaf.cache=false
使用 Thymeleaf 的語法替換之前 JSP 中的 EL 表示式和 JSTL。
Spring Boot 預設情況下,會把所有錯誤都交給 BasicErrorController 類完成處理,錯誤的檢視我們放到 classpath:/static/error/ 和 classpath:/templates/error/ 路徑上,HTTP 錯誤狀態碼就是預設檢視的名稱。如:
自己定義一個控制器增強器,專門用於統一例外處理,該方式一般用於處理 5xx 類錯誤。
@ControllerAdvice // 控制器訊息,這個註解為了spring幫我們建立物件 public class ExceptionControllerAdvice { @ExceptionHandler(RuntimeException.class) // 處理什麼型別的異常 //返回值形式也可以自定義,可以返回modelAndView, public String handlException(RuntimeException e, Model model,HandlerMethod m) { //HandlerMethod這個物件存放了spring對控制器的方法和控制器物件 //將錯誤資訊存入到model中 e.printStackTrace(); // 記得這行程式碼保留,不然專案後臺出異常,開發工具控制檯看不到錯誤資訊 return "errorView"; // 指定錯誤頁面檢視名稱,然後在頁面從model物件中拿到錯誤資訊 } }
定義一個設定類,實現 WebMvcConfigurer 介面,在 addInterceptors 方法註冊攔截器。
@Configuration public class MvcJavaConfig implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; //攔截器類實現HandlerInterceptor @Autowired private PermissionInterceptor permissionInterceptor; //攔截器類實現HandlerInterceptor public void addInterceptors(InterceptorRegistry registry) { // 註冊登入攔截器 registry.addInterceptor(loginInterceptor) // 對哪些資源起過濾作用 .addPathPatterns("/**") // 對哪些資源起排除作用 .excludePathPatterns("/login", "/static/**");//多個路徑 //多個攔截器 // 註冊許可權攔截器 registry.addInterceptor(permissionInterceptor) // 對哪些資源起過濾作用 .addPathPatterns("/**") // 對哪些資源起排除作用 .excludePathPatterns("/login", "/static/**"); } }
由於slf4j是後來出現的紀錄檔標準,目的是統一之前很多紀錄檔框架的使用方式,對主流的紀錄檔框架主動的實現了這個標準,實際就是呼叫各紀錄檔框架的api
在我們自定義的類中可以使用紀錄檔框架來輸出。
在類中注入一個靜態 Logger 物件,傳入當前類的作用是方便輸出紀錄檔時可以清晰地看到該紀錄檔資訊是屬於哪個類的。
private static final Logger log = LoggerFactory.getLogger(當前類.class);
使用 Lombok 提供的 @Slf4j 註解來簡化程式碼,其實和方式一的作用是一樣的。
@Slf4j @Service public class PermissionServiceImpl implements IPermissionService {}
在需要輸出紀錄檔的地方使用紀錄檔的輸出方法
log.info(...); log.error(...); ... // 輸出紀錄檔中有變數可以使用 {} 作為預留位置 log.info("刪除id為{}的資料", id);
紀錄檔級別由低到高 trace < debug < info < warn < error。
log.debug("許可權插入成功:{}",expression); log.info("許可權插入成功:{}",expression); log.warn("許可權插入成功:{}",expression);
執行許可權載入功能後,發現控制檯出現 info 與 warn 的資訊,debug 的沒有顯示,原因是因為 Spring Boot 預設的紀錄檔級別是 info,所以 debug 低於 info 級別,就不會顯示出來了。
若要修改紀錄檔顯示級別,最快速的方式是在 application.properties 設定,設定如下
# 把紀錄檔級別修改為 debug,不過我們一般不會更改,除非要偵錯找 bug,不然控制檯顯示的內容太多也容易亂,下面為全域性設定,單路徑設定如列印 SQL 紀錄檔 logging.level.cn.xxx.mapper=trace logging.level.root=debug
Logback 框架預設會自動載入 classpath:logback.xml,作為框架的組態檔,在 Spring Boot專案中使用時,還會額外的支援自動載入classpath:logback-spring.xml,在 Spring Boot 專案中推薦使用 logback-spring.xml,功能更強大些。
<?xml version="1.0" encoding="UTF-8"?> <!-- scan:開啟紀錄檔框架的熱部署,預設值 true 表示開啟 scanPeriod:熱部署的頻率,預設值 60 second debug:設定輸出框架內部的紀錄檔,預設值 false --> <configuration scan="true" scanPeriod="60 second" debug="false"> <property name="appName" value="springboot demo" /> <contextName>${appName}</contextName> <!-- appender:紀錄檔輸出物件,設定不同的類擁有不同的功能 ch.qos.logback.core.ConsoleAppender:紀錄檔輸出到控制檯 --> <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> <!-- 是否為在原有檔案追加內容方式--> <file>MyLog.log</file> <!-- 紀錄檔存放的檔案,也可以指定路徑 --> </appender> <!-- root 是專案通用的 logger,一般情況下都是使用 root 設定的紀錄檔輸出 level:按照級別輸出紀錄檔,紀錄檔級別,級別越高,輸出的內容越少 --> <root level="info"> <appender-ref ref="STDOUT" /> <!-- 紀錄檔輸出到控制檯還是存入檔案中 --> </root> <!-- 自定義的 logger,用於專門輸出特定包中列印的紀錄檔 <logger name="cn.xxx.crm.mapper" level="trace"> </logger> --> </configuration>
參考紀錄檔格式:
格式中的識別符號組成:
一般開發過程,紀錄檔記錄到控制檯
實際上線了, 紀錄檔一般記錄到檔案中
Spring Boot 提供了一些擴充套件點,比如修改 banner:在 resources 根目錄中放入 banner.txt 檔案,替換預設的啟動spring列印的字樣。
# application.properties # 關閉 banner spring.main.banner-mode=off
除了使用 JRebel 外掛(收費)來實現熱部署,還可以使用 Spring Boot 提供的 spring-boot-devtools 包來完成 Springboot 應用熱部署,從而實現更改方法內程式碼和模板檔案不需要重啟,只需要點選編譯即可。
<!-- Spring Boot 熱部署外掛 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
Spring Boot 重啟是 reload 重啟,通過監控 classpath 的變化,如果 classpath 中的檔案發生變化,即觸發重啟。Spring Boot 通過兩個 classpath 來完成 reload,一個 basic classloader 中載入不變的類(jar 包中的類),一個 restart classloader 中載入 classpath 中的類(自己寫的類),重啟的時候,restart classloader 中的類丟棄並重新載入。
下面是相關的一些設定,一般不用設定
# 預設排除不需要更新的資源 spring.devtools.restart.exclude=static/**,templates/**,public/** # 增加額外的排除資源 # 處理預設設定排除之外的 spring.devtools.restart.additional-exclude=public/** # 禁用自動重啟 spring.devtools.restart.enabled=false
在實際開發中,一個系統是有多套執行環境的,如開發時有開發的環境,測試時有測試的環境,不同的環境中,系統的引數設定是不同的,如:連線開發資料和測試資料庫的 URL 絕對是不同的,那麼怎麼快速的切換系統執行的環境呢?我們需要為不同的環境建立不同的組態檔,如下:
# application-dev.properties server.port=8081
# application-test.properties server.port=8082
最後我們在 application.properties 中指定需要使用的環境即可
# 在 application.properties 中指定需要使用的環境即可 spring.profiles.active=dev
在命令列模式下啟動也可以啟用: java -jar xxx --spring.profiles.active=dev
到此這篇關於ssm專案改造spring boot專案的文章就介紹到這了,更多相關ssm改造spring boot專案內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45