SpringBoot從零搭建配置并整合mybatis

現(xiàn)在項(xiàng)目基本都是使用的SpringBoot挂捅,但是為什么選擇SpringBoot以及SpringBoot的優(yōu)勢(shì)是什么?這篇文件就介紹一下怎么創(chuàng)建一個(gè)SpringBoot护盈。首先了解SpringBoot先去官網(wǎng)>https://spring.io/projects/spring-boot 查看SpringBoot的介紹挟纱。

springboot

我們主要看一下紅框中的介紹,Spring Boot 可以輕松創(chuàng)建基于 Spring 的應(yīng)用程序黄琼,你只需要直接運(yùn)行就可以樊销。所以Spring Boot就是為了讓我們更加方便的使用Spring。

1.SpringBoot特性

我們先了解一下SpringBoot的4大特性脏款,然后帶著這4個(gè)特性去創(chuàng)建一個(gè)SpringBoot

  • SpringBoot Starter:他將常用的依賴(lài)分組進(jìn)行了整合围苫,將其合并到一個(gè)依賴(lài)中,這樣就可以一次性添加到項(xiàng)目的Maven或Gradle構(gòu)建中撤师;后面我們新建SpringBoot項(xiàng)目的時(shí)候就會(huì)在pom引入spring-boot-starter-web剂府,他會(huì)將我們所需要的spring和springmvc的依賴(lài)自動(dòng)引入。這樣我們就不用一個(gè)一個(gè)去找spring和springmvc的這么多依賴(lài)的坐標(biāo)剃盾。
  • 使編碼變得簡(jiǎn)單腺占,SpringBoot采用 JavaConfig的方式對(duì)Spring進(jìn)行配置,并且提供了大量的注解痒谴,極大的提高了工作效率衰伯。
  • 自動(dòng)配置:SpringBoot的自動(dòng)配置特性利用了Spring對(duì)條件化配置的支持,合理地推測(cè)應(yīng)用所需的bean并自動(dòng)化配置他們积蔚;比如在spring中我們?nèi)绻獙⒌谌絡(luò)ar包中的類(lèi)存放到IOC容器中我們需要配置config.xml意鲸,在SpringBoot中他會(huì)根據(jù)pom引入的依賴(lài)自動(dòng)將一些bean裝填到IOC中。
  • 使部署變得簡(jiǎn)單,SpringBoot內(nèi)置了三種Servlet容器怎顾,Tomcat读慎,Jetty,undertow.我們只需要一個(gè)Java的運(yùn)行環(huán)境就可以跑SpringBoot的項(xiàng)目了,SpringBoot的項(xiàng)目可以打成一個(gè)jar包槐雾。

2. 創(chuàng)建Springboot項(xiàng)目

2.1 使用Spring Initializr方式構(gòu)建Spring Boot項(xiàng)目

如果使用idea可以像下圖一樣創(chuàng)建夭委,但是創(chuàng)建過(guò)程中必須聯(lián)網(wǎng)。當(dāng)然也可以直接官網(wǎng)>https://start.spring.io/ 中創(chuàng)建

image.png

然后我們可以選擇我們項(xiàng)目需要的依賴(lài)
image.png

就這么簡(jiǎn)單募强,現(xiàn)在Springboot就創(chuàng)建好了株灸,創(chuàng)建好的目錄結(jié)構(gòu)如下
image.png

這時(shí)候就有疑問(wèn)了?為什么Spring項(xiàng)目在pom文件中為什么沒(méi)有看到Spring和SpringMVC需要的依賴(lài)呢擎值?
這就是我們所說(shuō)的Springboot核心之一的SpringBoot Starter所完成的工作蚂且。我們可以看到

     <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <!-- ================ -->
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
image.png

我們可以看到spring-boot-starter-web將我們所需要的依賴(lài)都已經(jīng)寫(xiě)好了,省去了我們自己手動(dòng)配置的麻煩幅恋。

2.2 創(chuàng)建Controller

新建一個(gè)Controller包并創(chuàng)建一個(gè)Controller類(lèi),然后將啟動(dòng)類(lèi)SpringbootDemoApplication放在和Controller同級(jí)目錄下泵肄。因?yàn)锧SpringBootApplication這個(gè)注解只能掃描所在包及子包捆交。


image.png

然后運(yùn)行啟動(dòng)類(lèi)訪問(wèn)就能看到成功訪問(wèn)。


image.png

3. 熱部署

在開(kāi)發(fā)項(xiàng)目過(guò)程中腐巢,當(dāng)修改了某些代碼后需要本地驗(yàn)證時(shí)品追,需要重啟本地服務(wù)進(jìn)行驗(yàn)證,啟動(dòng)這個(gè)項(xiàng)目冯丙,如果項(xiàng)目龐大的話(huà)還是需要較長(zhǎng)時(shí)間的肉瓦,spring開(kāi)發(fā)團(tuán)隊(duì)為我們帶來(lái)了一個(gè)插件:spring-boot-devtools,很好的解決了本地驗(yàn)證緩慢的問(wèn)題胃惜。

pom添加

<!-- 引入熱部署依賴(lài) -->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-devtools</artifactId>
</dependency>

idea設(shè)置


image.png

在項(xiàng)目任意頁(yè)面中使用組合快捷鍵“Ctrl+Shift+Alt+/”打開(kāi)選項(xiàng)框泞莉,選中并打開(kāi)Registry注冊(cè)表頁(yè)面


image.png

每次修改代碼不用我們手動(dòng)重新啟動(dòng),引入了插件后船殉,插件會(huì)監(jiān)控我們classpath的資源變化鲫趁,當(dāng)classpath有變化后,會(huì)觸發(fā)重啟利虫。

該插件重啟快速的原因:這里對(duì)類(lèi)加載采用了兩種類(lèi)加載器挨厚,對(duì)于第三方j(luò)ar包采用base-classloader來(lái)加載,對(duì)于開(kāi)發(fā)人員自己開(kāi)發(fā)的代碼則使用restartClassLoader來(lái)進(jìn)行加載糠惫,這使得比停掉服務(wù)重啟要快的多疫剃,因?yàn)槭褂貌寮皇侵貑㈤_(kāi)發(fā)人員編寫(xiě)的代碼部分。

某些資源在更改后不一定需要觸發(fā)重新啟動(dòng)硼讽。默認(rèn)情況下巢价,改變資源 /META-INF/maven , /META-INF/resources , /resources 蹄溉, /static 咨油, /public ,或 /templates 不觸發(fā)重新啟動(dòng)柒爵,但確會(huì)觸發(fā)現(xiàn)場(chǎng)重裝役电。如果要自定義這些排除項(xiàng),則可以使用該spring.devtools.restart.exclude 屬性棉胀。例如法瑟,僅排除 /static , /public 您將設(shè)置以下屬性:
spring.devtools.restart.exclude=static/**,public/**

4. 全局配置文件

4.1 全局配置文件概述及優(yōu)先級(jí)

全局配置文件能夠?qū)σ恍┠J(rèn)配置值進(jìn)行修改及自定義配置唁奢。
Spring Boot使用一個(gè)application.properties或者application.yaml的文件作為全局配置文件
也可以從ConfigFileApplicationListener這類(lèi)便可看出霎挟,其中DEFAULT_SEARCH_LOCATIONS屬性設(shè)置了加載的目錄:

–file:./config/
–file:./
–classpath:/config/
–classpath:/
  • 先去項(xiàng)目根目錄找config文件夾下找配置文件件
  • 再去根目錄下找配置文件
  • 去resources下找cofnig文件夾下找配置文件
  • 去resources下找配置文件
image.png

SpringBoot會(huì)從這四個(gè)位置全部加載主配置文件,如果高優(yōu)先級(jí)中配置文件屬性與
低優(yōu)先級(jí)配置文件不沖突的屬性麻掸,則會(huì)共同存在— 互補(bǔ)配置 酥夭。

備注:
這里說(shuō)的配置文件,都還是項(xiàng)目里面脊奋。最終都會(huì)被打進(jìn)jar包里面的熬北,需要注意。
1诚隙、如果同一個(gè)目錄下讶隐,有application.yml也有application.properties,Springboot 2.4版本之前默認(rèn)先讀取application.properties久又,2.4版本之后的優(yōu)先讀取application.yml巫延。
2、如果同一個(gè)配置屬性地消,在多個(gè)配置文件都配置了炉峰,默認(rèn)使用第1個(gè)讀取到的,后面讀取的不覆蓋前面讀取到的脉执。
3讲冠、創(chuàng)建SpringBoot項(xiàng)目時(shí),一般的配置文件放置在“項(xiàng)目的resources目錄下”

如果我們的配置文件名字不叫application.properties或者application.yml适瓦,可以通過(guò)以下參數(shù)來(lái)指定配置文件的名字竿开,myproject是配置文件名
$ java -jar myproject.jar --spring.config.name=myproject
我們同時(shí)也可以指定其他位置的配置文件來(lái)生效
java -jar run-0.0.1-SNAPSHOT.jar -- spring.config.location=D:/application.properties

4.2 配置文件屬性注入

使用Spring Boot全局配置文件設(shè)置屬性時(shí):
如果配置屬性是Spring Boot已有屬性,例如服務(wù)端口server.port玻熙,那么Spring Boot內(nèi)部會(huì)自動(dòng)掃描并讀取這些配置文件中的屬性值并覆蓋默認(rèn)屬性否彩。
如果配置的屬性是用戶(hù)自定義屬性,例如剛剛自定義的User實(shí)體類(lèi)屬性嗦随,還必須在程序中注入這些配置屬性方可生效列荔。

  • @Configuration:聲明一個(gè)類(lèi)作為配置類(lèi)
  • @Bean:聲明在方法上敬尺,將方法的返回值加入Bean容器
  • @Value:屬性注入
  • @ConfigurationProperties(prefix = "jdbc"):批量屬性注入
  • @PropertySource("classpath:/jdbc.properties")指定外部屬性文件。在類(lèi)上添加
    比如application.properties添加信息
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/springboot_h
jdbc.username=root
jdbc.password=123

配置數(shù)據(jù)源

  • @Value注入屬性 @Bean加入容器
@Configuration
public class JdbcConfiguration {
  @Value("${jdbc.url}")
  String url;
  @Value("${jdbc.driverClassName}")
  String driverClassName;
  @Value("${jdbc.username}")
  String username;
  @Value("${jdbc.password}")
  String password;
  @Bean
  public DataSource dataSource() {
    DruidDataSource dataSource = new DruidDataSource();
    dataSource.setUrl(url);
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
 }
}
  • @ConfigurationProperties批量注入
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
@ConfigurationProperties (prefix = "jdbc")  //這里需要定義出在application文件中定義屬性值得前綴信息
public class JdbcProperties {
  private String url;
  private String driverClassName;
  private String username;
  private String password;
  // 注:要生成屬性的set方法
}

@EnableConfigurationProperties 是 Spring Boot 提供的一個(gè)注解贴浙,使用該注解用于啟用應(yīng)用對(duì)另外一個(gè)注解 @ConfigurationProperties 的支持砂吞,,用于設(shè)置一組使用了注解@ConfigurationProperties 的類(lèi),用于作為 bean 定義注冊(cè)到容器中崎溃。
或者

@Component
@ConfigurationProperties (prefix = "jdbc")  //這里需要定義出在application文件中定義屬性值得前綴信息
public class JdbcProperties {
  private String url;
  private String driverClassName;
  private String username;
  private String password;
  // 注:要生成屬性的set方法
}

ConfigurationProperties 使用set注入蜻直,必須要生成set方法

5. 松散綁定

Spring Boot使用一些寬松的規(guī)則將環(huán)境屬性綁定到@ConfigurationProperties bean,因此環(huán)境屬性名和bean屬性名之間不需要完全匹配
例如

public class OwnerProperties {
  private String firstName;
}
owner.first-name: 泰森

owner.first-name 羊肉串模式case, 推薦使用
owner.firstName 標(biāo)準(zhǔn)駝峰模式
owner.first_name 下劃線(xiàn)模式
OWNER_FIRSTNAME 大寫(xiě)下劃線(xiàn)袁串,如果使用系統(tǒng)環(huán)境時(shí)候推薦使用

6. 日志框架

Springboot 默認(rèn)已經(jīng)使用了 SLF4J(日志抽象層) + LogBack(日志實(shí)現(xiàn)層)記錄日志
自定義日志輸出

# 日志配置
# 指定具體包的日志級(jí)別
logging.level.com.lagou=debug
# 控制臺(tái)和日志文件輸出格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level
%logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}
- %msg%n
# 日志輸出路徑概而,默認(rèn)文件spring.log
logging.file.path=spring.log
#logging.file.name=log.log

SpringBoot數(shù)據(jù)源配置

7.配置數(shù)據(jù)源

在application.properties中配置數(shù)據(jù)庫(kù)連接

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///springboot_h?
useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
# spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

配置spring-boot-starter-jdbc

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

7.1 Druid連接池配置

在pom中引入依賴(lài)

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>

在application.yml中引入druid的相關(guān)配置

spring:
datasource:
 username: root
 password: root
 url: jdbc:mysql:///springboot_h?useUnicode=true&characterEncoding=utf-
8&useSSL=true&serverTimezone=UTC
 driver-class-name: com.mysql.cj.jdbc.Driver
 initialization-mode: always
  # 使用druid數(shù)據(jù)源
 type: com.alibaba.druid.pool.DruidDataSource
  # 數(shù)據(jù)源其他配置
 initialSize: 5
 minIdle: 5
 maxActive: 20
 maxWait: 60000
 timeBetweenEvictionRunsMillis: 60000
 minEvictableIdleTimeMillis: 300000
 validationQuery: SELECT 1 FROM DUAL
 testWhileIdle: true
 testOnBorrow: false
 testOnReturn: false
 poolPreparedStatements: true
  # 配置監(jiān)控統(tǒng)計(jì)攔截的filters,去掉后監(jiān)控界面sql無(wú)法統(tǒng)計(jì)囱修,'wall'用于防火墻
 filters: stat,wall,log4j
 maxPoolPreparedStatementPerConnectionSize: 20
 useGlobalDataSourceStat: true
 connectionProperties:
druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

如果單純?cè)趛ml文件中編寫(xiě)如上的配置赎瑰,SpringBoot肯定是讀取不到druid的相關(guān)配置
的。因?yàn)樗⒉幌裎覀冊(cè)膉dbc破镰,系統(tǒng)默認(rèn)就使用DataSourceProperties與其屬性進(jìn)行了綁
定舞箍。所以我們應(yīng)該編寫(xiě)一個(gè)類(lèi)與其屬性進(jìn)行綁定

編寫(xiě)整合druid的配置類(lèi)DruidConfig

public class DruidConfig {
  @ConfigurationProperties(prefix = "spring.datasource")
  @Bean
  public DataSource druid(){
    return new DruidDataSource();
 }
}

因?yàn)槲覀僺pringBoot2.0以后使用的日志框架已經(jīng)不再使用log4j了妆丘。此時(shí)應(yīng)該引入相應(yīng)的適配器路操。
我們可以在pom.xml文件上加入

<!--引入適配器-->
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
</dependency

7.2 整合mybatis

新建springboot項(xiàng)目廓奕,并導(dǎo)入mybatis的pom配置

<!-- 配置數(shù)據(jù)庫(kù)驅(qū)動(dòng)和mybatis dependency -->
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.3.2</version>
</dependency

application.yml配置

spring:
datasource:
 username: root
 password: root
 url: jdbc:mysql:///springboot_h?useUnicode=true&characterEncoding=utf-
8&useSSL=true&serverTimezone=UTC
 driver-class-name: com.mysql.jdbc.Driver
  # 使用druid數(shù)據(jù)源
 type: com.alibaba.druid.pool.DruidDataSource

總結(jié)
現(xiàn)在為止我們就可以使用我們創(chuàng)建的SpringBoot框架了,我們可以集成項(xiàng)目中需要的其他框架或者中間件宇整。方便了我們的開(kāi)發(fā),不用做哪些繁瑣的xml配置芋膘。在學(xué)習(xí)spring的時(shí)候感覺(jué)很復(fù)雜鳞青,使用Springboot以后感覺(jué)方便了很多。當(dāng)然他還是基于spring來(lái)開(kāi)發(fā)的为朋,還是需要了解到spring的原理才能更好的應(yīng)用臂拓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市习寸,隨后出現(xiàn)的幾起案子胶惰,更是在濱河造成了極大的恐慌,老刑警劉巖霞溪,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孵滞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鸯匹,警方通過(guò)查閱死者的電腦和手機(jī)坊饶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)殴蓬,“玉大人匿级,你說(shuō)我怎么就攤上這事。” “怎么了痘绎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵津函,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我孤页,道長(zhǎng)尔苦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任散庶,我火速辦了婚禮蕉堰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悲龟。我一直安慰自己屋讶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布须教。 她就那樣靜靜地躺著皿渗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轻腺。 梳的紋絲不亂的頭發(fā)上乐疆,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音贬养,去河邊找鬼挤土。 笑死,一個(gè)胖子當(dāng)著我的面吹牛误算,可吹牛的內(nèi)容都是我干的仰美。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼儿礼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咖杂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蚊夫,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诉字,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后知纷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體壤圃,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年琅轧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埃唯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹰晨,死狀恐怖墨叛,靈堂內(nèi)的尸體忽然破棺而出止毕,到底是詐尸還是另有隱情,我是刑警寧澤漠趁,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布扁凛,位于F島的核電站,受9級(jí)特大地震影響闯传,放射性物質(zhì)發(fā)生泄漏谨朝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一甥绿、第九天 我趴在偏房一處隱蔽的房頂上張望字币。 院中可真熱鬧,春花似錦共缕、人聲如沸洗出。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翩活。三九已至,卻和暖如春便贵,著一層夾襖步出監(jiān)牢的瞬間菠镇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工承璃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留利耍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓盔粹,卻偏偏與公主長(zhǎng)得像隘梨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玻佩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容