IDEA創(chuàng)建maven項(xiàng)目
使用IDEA創(chuàng)建maven項(xiàng)目,勾選從模板原型構(gòu)建,這里選擇maven-archetype-quickstart類型,這種類型的maven項(xiàng)目以jar包的方式提供對(duì)外統(tǒng)一的輸出,這是最快速的一個(gè)構(gòu)建Spring Boot研發(fā)項(xiàng)目的模板。在沒(méi)有Spring Boot的開(kāi)發(fā)框架時(shí),更多的選擇maven-archetype-webapp,這種方式創(chuàng)建的是以war包方式部署在Tomcat或JBoss這種J2EE的容器。
創(chuàng)建成功后,需要給目錄指定其為什么目錄,選定項(xiàng)目文件夾,右鍵選擇Mark Directory as,然后選擇目錄類型。還要在main目錄下創(chuàng)建resources目錄并指定類型。main目錄下的java目錄下放置java源代碼,resources目錄下放置spring、spring boot等的資源配置文件。
從零集成項(xiàng)目
查看Build with Maven目錄下pom.xml文件,從其中復(fù)制spring-boot-starter-parent依賴到項(xiàng)目中的pom.xml文件中,這樣當(dāng)前的項(xiàng)目就是Spring Boot項(xiàng)目。并在項(xiàng)目pom文件標(biāo)簽內(nèi)引入spring-boot-starter-parent下的spring-boot-starter-web和spring-boot-starter-test項(xiàng)目。
在APP class上加@EnableAutoConfiguration注解將APP的啟動(dòng)類當(dāng)成可以支持自動(dòng)化配置的bean,并且能夠開(kāi)啟整個(gè)工程類基于springboot的自動(dòng)化的配置,然后用下面這行代碼啟動(dòng)Spring Boot。
SpringApplication.run(App.class,args);
要實(shí)現(xiàn)Spring MVC的***controller***功能,則引入注解@RestController或@Controller
Spring Boot 對(duì)應(yīng)的配置化操作,只需要在resources目錄下創(chuàng)建默認(rèn)配置文件——application.yml或application.properties,在其中進(jìn)行配置。
集成Mybatis
進(jìn)入pom文件,確定使用的數(shù)據(jù)庫(kù),使用mysql,則引入mysql-connector-java包;確定使用什么連接池來(lái)管理mysql的鏈接,這里使用阿里巴巴的druid連接池。然后將spring boot對(duì)mybatis的支持引入,這里使用mybatis-spring-boot-starter包;在配置文件類導(dǎo)入mybatis需要的一些配置,用來(lái)啟動(dòng)一個(gè)帶mybatis數(shù)據(jù)庫(kù)訪問(wèn)的一個(gè)spring boot工程,例:
mybatis:? mapper-locations:classpath:mapping/*.xmlspring:? datasource:? ? name:miaohsa? ? url:jdbc:mysql://localhost:3306/miaosha?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC? ? username:root? ? password:123456#使用druid數(shù)據(jù)源? ? type:com.alibaba.druid.pool.DruidDataSource? ? driver-class-name:com.mysql.jdbc.Driver
mybatis的自動(dòng)生成工具
然后使用mybatis的自動(dòng)生成工具,用來(lái)生成對(duì)應(yīng)數(shù)據(jù)庫(kù)文件的映射。
在pom中引入mybatis自動(dòng)生成的插件,例:
org.mybatis.generatormybatis-generator-maven-plugin1.3.5org.mybatis.generatormybatis-generator-core1.3.5mysqlmysql-connector-java5.1.47mybatis generatorpackagegenerate<!--允許移動(dòng)生成的文件-->true<!--不允許自動(dòng)覆蓋文件-->falsesrc/main/resources/mybatis-generator.xml復(fù)制代碼
其中mybatis-generator.xml文件在官網(wǎng)中有,可粘貼過(guò)來(lái),刪改使用,例:
<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE generatorConfiguration
? ? ? ? PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
? ? ? ? "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><!--數(shù)據(jù)庫(kù)鏈接地址賬號(hào)密碼--><!--生成dataobject類的存放位置--><!--生成映射文件存放位置--><!--生成Dao類的存放位置--><!-- 客戶端代碼,生成易于使用的針對(duì)Model對(duì)象和XML配置文件的代碼
? ? ? ? ? ? ? type="ANNOTATIONDMAPPER",生成Java Model和基于注解的Mapper 對(duì)象
? ? ? ? ? ? ? type="MIXEDMAPPER",生成基于注解的Java Model和相應(yīng)的Mapper對(duì)象
? ? ? ? ? ? ? type="XMLMAPPER",生成SQLMap XML 文件和獨(dú)立的Mapper接口
? ? ? ? --><!--生成對(duì)應(yīng)表和類名-->
在Run/Debug Configuration下新建一個(gè)Maven的配置,例:

將@EnableAutoConfiguration注解改為@SpringBootApplication,其等價(jià)于以默認(rèn)屬性使用@Configuration , @EnableAutoConfiguration 和@ComponentScan 。最終啟動(dòng)類注解例:
@SpringBootApplication(scanBasePackages = {"com.miaosha"})@RestController@MapperScan("com.miaosha.dao")
SpringMVC方式進(jìn)行開(kāi)發(fā)
使用SpringMVC方式進(jìn)行開(kāi)發(fā),項(xiàng)目結(jié)構(gòu)

其中dao層與dataobject層由mybatis自動(dòng)生成工具生成,dataobject層(負(fù)責(zé)數(shù)據(jù)存儲(chǔ)到service層的傳輸)下的類對(duì)應(yīng)數(shù)據(jù)庫(kù)對(duì)象模型,其中的字段與數(shù)據(jù)庫(kù)一一映射,dao層下的類定義對(duì)數(shù)據(jù)庫(kù)進(jìn)行交互的方法,在resources的mapping目錄下有自動(dòng)生成dao層對(duì)應(yīng)的配置文件,一起實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作。
在service層下model目錄下創(chuàng)建對(duì)象模型(不可以把數(shù)據(jù)庫(kù)的映射簡(jiǎn)單透?jìng)鞣祷亟o想要service的服務(wù),這個(gè)model對(duì)應(yīng)Spring MVC中業(yè)務(wù)邏輯交互的模型),然后在數(shù)據(jù)庫(kù)中創(chuàng)建對(duì)應(yīng)的表,在service層下創(chuàng)建對(duì)應(yīng)對(duì)象的service接口,接口中定義需要的方法(方法的返回類型大部分為model對(duì)象),在service層下impl目錄下去實(shí)現(xiàn)。添加方法:在mapping目錄下對(duì)應(yīng)配置文件中添加相應(yīng)的SQL語(yǔ)句,在dao目錄下的對(duì)應(yīng)接口中建立映射(添加方法)。
注:若數(shù)據(jù)庫(kù)表中設(shè)有自增id,需在mapping目錄下配置文件中的insert標(biāo)簽中添加屬性u(píng)seGeneratedKeys="true" 和keyProperty="id",指定自增id
在serviceImpl中定義數(shù)據(jù)庫(kù)對(duì)象dataobject與模型對(duì)象model相互轉(zhuǎn)換的方法,在controller中定義模型對(duì)象model與視圖對(duì)象viewobject相互轉(zhuǎn)換的方法,這里使用到了org.springframework.beans.BeanUtils方法(作用為將一個(gè)Bean對(duì)象中的數(shù)據(jù)封裝到另一個(gè)屬性結(jié)構(gòu)相似的Bean對(duì)象中,有些屬性可能由于類型原因無(wú)法封裝,需要手動(dòng)添加)。
serviceImpl類與controller類中分別需要添加**@Service注解和@Controller注解**
response層定義了統(tǒng)一返回類型,有一個(gè)通用對(duì)象,最終返回前端的對(duì)象為該通用對(duì)象
error層有一個(gè)common error接口,一個(gè)Enum枚舉類實(shí)現(xiàn)該接口,該枚舉類通過(guò)構(gòu)造方法構(gòu)造一個(gè)實(shí)現(xiàn)common error接口的enum類型的子類,一個(gè)繼承Exception且實(shí)現(xiàn)common error方法的類,其內(nèi)強(qiáng)關(guān)聯(lián)一個(gè)對(duì)應(yīng)的common error(即enum類),且實(shí)現(xiàn)其對(duì)應(yīng)構(gòu)造函數(shù)以方便使用。該方式對(duì)應(yīng)設(shè)計(jì)模式——包裝器業(yè)務(wù)異常類實(shí)現(xiàn)。
在controller層下viewobject目錄下創(chuàng)建可供UI使用的對(duì)象,其中的字段為可以給用戶查看的字段。在controller層下創(chuàng)建對(duì)應(yīng)對(duì)象的controller類,在其中調(diào)用其service接口中的方法來(lái)實(shí)現(xiàn)相應(yīng)邏輯。
controller層下還有一個(gè)基類BaseController,其定義了controller類下接口上的@RequestMapping注解中的屬性consumes(指定處理請(qǐng)求的提交內(nèi)容類型)的默認(rèn)值(GET請(qǐng)求不需要);并通過(guò)定義exceptionhandler解決未被controller層吸收的exception(為業(yè)務(wù)邏輯處理上的問(wèn)題或業(yè)務(wù)邏輯錯(cuò)誤而并非服務(wù)端不能處理的錯(cuò)誤),例:
@ExceptionHandler(Exception.class)//需要指明收到什么樣的exception之后才會(huì)進(jìn)入它的處理環(huán)節(jié),此處定義為根類@ResponseStatus(HttpStatus.OK)//捕獲到controller拋出的exception,并返回HttpStatus.OK,即status=200@ResponseBody//handler exception使用這種方式(Object會(huì)尋找本地頁(yè)面文件)僅僅只能返回頁(yè)面路徑,無(wú)法處理viewobject類對(duì)應(yīng)的@ResponseBody形式,加上@ResponseBody注解即可解決publicObjecthandlerException(HttpServletRequest request, Exception ex){//獲取異常并處理}
其他所有controller類都要繼承基類BaseController
在UserController中,用戶登錄接口中將登陸憑證加入到用戶登錄成功的session中
@AutowiredprivateHttpServletRequest httpServletRequest;//通過(guò)bean的方式注入進(jìn)來(lái),代表這個(gè)HttpServletRequest是單例模式//單例模式怎么可以支持一個(gè)request支持多個(gè)用戶的并發(fā)訪問(wèn)?//bean包裝的HttpServletRequest,本質(zhì)是一個(gè)proxy,它內(nèi)部擁有ThreadLocal方式的map,去讓用戶在每個(gè)線程當(dāng)中去處理它自己對(duì)應(yīng)的request,//并且有ThreadLocal清除機(jī)制,可以放心使用,且這個(gè)HttpServletRequest對(duì)應(yīng)當(dāng)前用戶的http請(qǐng)求
//將登陸憑證加入到用戶登錄成功的session中,分布式中用tokenthis.httpServletRequest.getSession().setAttribute("IS_LOGIN",true);this.httpServletRequest.getSession().setAttribute("LOGIN_USER",userVO);
登錄密碼加密
因?yàn)閖dk自帶的MD5實(shí)現(xiàn)的方式只支持16位MD5,更改加密方法,例:
//將密碼加密publicStringEncodeByMd5(String str)throwsNoSuchAlgorithmException, UnsupportedEncodingException{//確定計(jì)算方法MessageDigest md5 = MessageDigest.getInstance("MD5");? ? BASE64Encoder base64Encoder =newBASE64Encoder();//加密字符串String newstr = base64Encoder.encode(md5.digest(str.getBytes("utf-8")));returnnewstr;}
validator層下為格式化校驗(yàn)規(guī)則,在pom文件中引入Apache Commons Lang包,使用了其StringUtils工具類;還引入了hibernate-validator包來(lái)進(jìn)行校驗(yàn)。其下建立一個(gè)校驗(yàn)結(jié)果對(duì)象,對(duì)象中還創(chuàng)建一個(gè)獲取錯(cuò)誤信息的方法以便使用;并創(chuàng)建一個(gè)實(shí)現(xiàn)InitializingBean類的一個(gè)校驗(yàn)實(shí)現(xiàn)類,將hibernate validator 通過(guò)工廠校驗(yàn)的方式使其實(shí)例化,然后實(shí)現(xiàn)校驗(yàn)方法并返回校驗(yàn)結(jié)果對(duì)象。另外對(duì)字段有什么限制可在model層下對(duì)象模型的字段上添加注解如@NotBlank、@NotNull、@Max、@Min等。
跨域解決
在controller類上加上如下注解:
@CrossOrigin(allowCredentials ="true",allowedHeaders ="*")//實(shí)現(xiàn)跨域
DEFAULT_ALLOW_CREDENTIALS = true:
需配合前端設(shè)置xhrFields授信后,
使得跨域session共享
前端ajax請(qǐng)求添加設(shè)置:xhrFields:{withCredentials:true}
DEFAULT_ALLOWED_HEADERS = *:
允許跨域傳輸所有的header參數(shù),將用于使用token放入header域做session共享的跨域請(qǐng)求
在此我向大家推薦一個(gè)架構(gòu)學(xué)習(xí)交流群。交流學(xué)習(xí)群號(hào):938837867 暗號(hào):555 里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備