SpringBoot專案開發常用技術整合
目錄
- 1 建立一個springboot demo
- 1.1 建立Restful介面
- 2 介面返回通用ON物件
- 2.1 構建通用返回物件JSONResult
- 2.2 使用Jackson
- 3 SpringBoot開發環境熱部署
- 4 資原始檔屬性配置
- 4.1 資原始檔中的屬性配置與對映到實體類
- 4.2 Server和Tomcat配置(詳細配置參考Gitee)
- 5 SpringBoot整合模板引擎
- 5.1 整合freemarker
- 5.2 整合thymeleaf
- 5.2.1 整合i18n屬性配置
- 6 全域性捕獲異常
- 7 整合mybatis以及分頁
- 7.1 mybatis-generator的使用
- 7.2 tkmybatis的一些用法
- 8 宣告式事務支援
- 9 整合Redis
- 10 整合定時功能
- 11 非同步任務
- 12 配置攔截器
1 建立一個springboot demo
pom.xml新增springboot相關依賴。
1.1 建立Restful介面
springmvc構造並且返回一個json物件:
- 在類上加@Controller註解
- 在方法上加@ResponseBody
springboot構造並且返回一個json物件:
- 在類上加@RestController註解(@RestController = @Controller + @ResponseBody)
2 介面返回通用JSON物件
2.1 構建通用返回物件JSONResult
參考gitee程式碼
public class JSONResult { private Integer status; // 響應狀態 private String msg; // 響應訊息 private Object data; // 資料 tcGYa /*靜態工廠方法*/ public static JSONResult build(Integer status,String msg,Object data) { return new JSONResult(status,msg,data); } public static JSONResult ok(Object data) { return new JSONResult(data); } }
2.2 使用Jackson
使用Jackson物件pojo物件屬性進行處理,例如隱藏、格式化輸出、預設值。
public class User { private String name; @JsonIgnore private String password; private Integer age; @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",locale = "zh",timezone = "GMT+8") private Date birthday; @JsonInclude(JsonInclude.Include.NON_NULL) private String desc; }
3 SpringBoot開發環境熱部署
devtools可以實現頁面熱部署(即頁面修改後會立即生效,可以直接在application.properties檔案中配置spring.thymeleaf.cache=false來實現),實現類檔案熱部署(類檔案修改後不會立即生效),實現對屬性檔案的熱部署。
即devtools會監聽classpath下的檔案變動,並且會立即重啟應用(發生在儲存時機),注意:因為其採用的虛擬機器機制,該項重啟是很快的 。
(1)base classloader (Base類載入器):載入不改變的Class,例如:第三方提供的jar包。
(2)restart classloader(Restart類載入器):載入正在開發的Class。
為什麼重啟很快,因為重啟的時候只是載入了在開發的Class,沒有重新載入第三方的jar包。
預設情況下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public這些資料夾下的檔案修改不會使應用重啟,但是會重新載入(devtools內嵌了一個LiveReload server,當資源發生改變時,瀏覽器重新整理)。
依賴
<!--熱部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <!-- optional=true,依賴不會傳遞,該專案依賴devtools; 之後依賴boot專案的專案如果想要使用devtools,需要重新引入 --> <optional>true</optional> </dependency>
配置
#熱部署生效 spring.devtools.restart.enabled=true #設定重啟的目錄 spring.devtools.restart.additional-paths=src/main/ #classpath目錄下的WEB-INF資料夾內容修改不重啟 spring.devtools.restart.exclude=WEB-INF/** #spring.devtools.restart.exclude=static/**,public/**
如果IDEA devtools熱部署沒有生效,進行以下操作。
- 開啟自動編譯:Files——Settings——Build,Execution,Deployment——Compiler
- 使用shift+ctrl+alt+/,選擇Registry。
4 資原始檔屬性配置
4.1 資原始檔中的屬性配置與對映到實體類
// com.lzp.opensource.name=lzp @Configuration @1(prefix = "com.lzp.opensource") @PropertySource(value = "classpath:resource.properties") public class Resource { private String name; private String website; private String language; }
4.2 Server和Tomcat配置(詳細配置參考Gitee)
server.port=8088 server.tomcat.uri-encoding=UTF-8
5 SpringBoot整合模板引擎
5.1 整合freemarker
新增依賴、配置,準備好前端頁面放到配置dir目錄下。測試程式碼:
/** * 測試向頁面注入屬性 * * @param modelMap * @return */ @RequestMapping("/index") public String index(ModelMap modelMap) { modelMap.addAttribute("resource",resource); return "freemarker/index"; } /** * 測試多層路徑,不需要加字尾 * * @return */ @RequestMapping("/center") public String center() { return "freemarker/center/center"; }
5.2 整合thymeleaf
############################################################ # thymeleaf 靜態資源配置 ############################################################ spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML5 spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.content-type=text/html # 關閉快取,即時重新整理,上線生產環境需要改為true spring.thymeleaf.cache=false ## 設定靜態檔案目錄,js、等 spring.mvc.static-path-pattern=/static/**
內容包含:
- 物件屬性獲取與頁面屬性設定 th:id
- html內容替換 th:text/utext
- 根元素設定 th:object
- 超連結 th:href
- form th:action="@{/th/postform}"
- 語法:比較、迴圈遍歷、switch
5.2.1 整合i18n屬性配置
i18n對程式來說,在不修改內部程式碼的情況下,能根據不同語言及地區顯示相應的介面。
############################################################# i18n 資源配置############################################################spring.messages.basename=i18n/messages# 快取時間 單位 sspring.messages.cache-duration=1spring.messages.encoding=UTF-8
指定目錄下配置屬性
roles.manager=managerroles.superadmin=lzp
6 全域性捕獲異常
頁面跳轉形式:介面直接返回一個頁面ModelAndView。
ajax形式:返回統一響應物件,前端解析物件獲取資料。
統一返回異常的形式
@ControllerAdvicepublic class ExceptionErrorHandler { /** * 異常跳轉頁面 */ public static final String ERROR_VIEW = "error"; @ExceptionHandler(value = Exception.class) public Object errorHandler(HttpServletRequest request,HttpServletResponse response,Exception e) throws Exception { // 後臺列印日誌 http://www.cppcns.come.printStackTrace(); if (isAjax(request)) { // 返回ajax響應 return JSONResult.errorException(e.getMessage()); } else { // 返回頁面 ModelAndView mav = new ModelAndView(); mav.addObject("exception",e); mav.addObject("url",request.getRequestURL()); // 把錯誤頁面返回給前端,而不是使用springboot自帶的頁面 mav.setViewName(ERROR_VIEW); return mav; } } /** * 判斷請求是否是ajax請求 * * @param httpRequest * @return */ public static boolean isAjax(HttpServletRequest httpRequest) { return (httpRequest.getHeader("X-Requested-With") != null && "XMLHttpRequest" .equals(httpRequest.getHeader("X-Requested-With").toString())); }}
7 整合mybatis以及分頁
7.1 mybatis-generator的使用
- 新增mybatis、、資料來源、tkmybatis、pagehelper依賴。如果用hikari,預設支援不需要引用依賴。
- 新增application.properties相關配置。
- 配置generatorConfig.xml pojo、mapper、xml、表等
- 使用GeneratorDisplay生成檔案。
Application新增mapper掃描配置
//掃描 mybatis mapper 包路徑@MapperScan(basePackages = "com.lzp.mapper")// 掃描指定位置@ComponentScan({"com.lzp","org.n3r.idworker"})@SpringBootApplicationpublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); }}
7.2 tkmybatis的一些用法
使用通用Mapper可以節省很多程式碼
public interface MyMapper<T> extends Mapper<T>,MySqlMapper<T> {}public interface SysUserMapper extends MyMapper<SysUser> {}
呼叫
userMapper.insert(user);userMapper.updateByPrimaryKeySelective(user);@Overridepublic List<SysUser> queryUserList(SysUser user) { // 條件 Example example = new Example(SysUser.class); Example.Criteria criteria = example.createCriteria(); criteria.andLike("username","%" + user.getUsername() + "%"); return userMapper.selectByExample(example);}
8 宣告式事務支援
@Transactional(propagation = Propagation.REQUIRED)@Overridepublic void saveUserTransactional(SysUser user) { userMapper.insert(user); int i = 1 / 0; user.setIsDelete(1); userMapper.updateByPrimaryKeySelective(user);}
REQUIRED 如果沒有事務,則建立事務;已有則加入到當前事務。
SUPPORTS 如果已有事務,加入當前事務;沒有也可以。
9 整合Redis
新增pom和application.properties配置
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
使用StringRedisTemplete操作資料。
10 整合定時功能
// 啟動定時操作 @EnableScheduling public class Application {...}
排程類
@Component public class SchedulerJob { @Scheduled(fixedRate = 3000) public void printLog() { System.out.println("每隔3秒"); } @Scheduled(cron = "0/1 * * * * ?") public void printLogInterval() { System.out.println("每隔1秒"); } }
11 非同步任務
Spring Boot非同步執行使用場景
- 傳送簡訊、傳送郵件
- App訊息推送
- 節省運維淩晨釋出任務時間提供效率
//開啟非同步呼叫方法 @EnableAsync public class Application {
結合
@Component public class AsyncTask { @Async public Future<Boolean> doTask11() throws Exception { long start = System.currentTimeMillis(); Thread.sleep(1000); long end = System.currentTimeMillis(); System.out.println("任務1耗時:" + (end - start) + "毫秒"); return new AsyncResult<>(true); } }
12 配置攔截器
攔截器,訪問某個請求前後進行攔截。
註冊配置
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Bean public UserTokenInterceptor userTokenInterceptor() { return new UserTokenInterceptor(); } /** * 註冊攔截器 * * @param registry */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(userTokenInterceptor()) .addPathPatterns("/testIntercept") .addPathPatterns("/hello") .addPathPatterns("/shopcart/add") } }
UserTokenInterceptor參考詳細程式碼。
程式碼地址
原始碼地址:https://gitee.com/dtyytop/initialdemo
到此這篇關於SpringBoot專案開發常用技術整合的文章就介紹到這了,更多相關SpringBoot開發內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!