SpringBoot从零搭建配置并整合mybatis

现在项目基本都是使用的SpringBoot,但是为什么选择SpringBoot以及SpringBoot的优势是什么?这篇文件就介绍一下怎么创建一个SpringBoot。首先了解SpringBoot先去官网>https://spring.io/projects/spring-boot 查看SpringBoot的介绍。

springboot

我们主要看一下红框中的介绍,Spring Boot 可以轻松创建基于 Spring 的应用程序,你只需要直接运行就可以。所以Spring Boot就是为了让我们更加方便的使用Spring。

1.SpringBoot特性

我们先了解一下SpringBoot的4大特性,然后带着这4个特性去创建一个SpringBoot

  • SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中;后面我们新建SpringBoot项目的时候就会在pom引入spring-boot-starter-web,他会将我们所需要的spring和springmvc的依赖自动引入。这样我们就不用一个一个去找spring和springmvc的这么多依赖的坐标。
  • 使编码变得简单,SpringBoot采用 JavaConfig的方式对Spring进行配置,并且提供了大量的注解,极大的提高了工作效率。
  • 自动配置:SpringBoot的自动配置特性利用了Spring对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们;比如在spring中我们如果要将第三方jar包中的类存放到IOC容器中我们需要配置config.xml,在SpringBoot中他会根据pom引入的依赖自动将一些bean装填到IOC中。
  • 使部署变得简单,SpringBoot内置了三种Servlet容器,Tomcat,Jetty,undertow.我们只需要一个Java的运行环境就可以跑SpringBoot的项目了,SpringBoot的项目可以打成一个jar包。

2. 创建Springboot项目

2.1 使用Spring Initializr方式构建Spring Boot项目

如果使用idea可以像下图一样创建,但是创建过程中必须联网。当然也可以直接官网>https://start.spring.io/ 中创建

image.png

然后我们可以选择我们项目需要的依赖
image.png

就这么简单,现在Springboot就创建好了,创建好的目录结构如下
image.png

这时候就有疑问了?为什么Spring项目在pom文件中为什么没有看到Spring和SpringMVC需要的依赖呢?
这就是我们所说的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将我们所需要的依赖都已经写好了,省去了我们自己手动配置的麻烦。

2.2 创建Controller

新建一个Controller包并创建一个Controller类,然后将启动类SpringbootDemoApplication放在和Controller同级目录下。因为@SpringBootApplication这个注解只能扫描所在包及子包。


image.png

然后运行启动类访问就能看到成功访问。


image.png

3. 热部署

在开发项目过程中,当修改了某些代码后需要本地验证时,需要重启本地服务进行验证,启动这个项目,如果项目庞大的话还是需要较长时间的,spring开发团队为我们带来了一个插件:spring-boot-devtools,很好的解决了本地验证缓慢的问题。

pom添加

<!-- 引入热部署依赖 -->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-devtools</artifactId>
</dependency>

idea设置


image.png

在项目任意页面中使用组合快捷键“Ctrl+Shift+Alt+/”打开选项框,选中并打开Registry注册表页面


image.png

每次修改代码不用我们手动重新启动,引入了插件后,插件会监控我们classpath的资源变化,当classpath有变化后,会触发重启。

该插件重启快速的原因:这里对类加载采用了两种类加载器,对于第三方jar包采用base-classloader来加载,对于开发人员自己开发的代码则使用restartClassLoader来进行加载,这使得比停掉服务重启要快的多,因为使用插件只是重启开发人员编写的代码部分。

某些资源在更改后不一定需要触发重新启动。默认情况下,改变资源 /META-INF/maven , /META-INF/resources , /resources , /static , /public ,或 /templates 不触发重新启动,但确会触发现场重装。如果要自定义这些排除项,则可以使用该spring.devtools.restart.exclude 属性。例如,仅排除 /static , /public 您将设置以下属性:
spring.devtools.restart.exclude=static/**,public/**

4. 全局配置文件

4.1 全局配置文件概述及优先级

全局配置文件能够对一些默认配置值进行修改及自定义配置。
Spring Boot使用一个application.properties或者application.yaml的文件作为全局配置文件
也可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置了加载的目录:

–file:./config/
–file:./
–classpath:/config/
–classpath:/
  • 先去项目根目录找config文件夹下找配置文件件
  • 再去根目录下找配置文件
  • 去resources下找cofnig文件夹下找配置文件
  • 去resources下找配置文件
image.png

SpringBoot会从这四个位置全部加载主配置文件,如果高优先级中配置文件属性与
低优先级配置文件不冲突的属性,则会共同存在— 互补配置 。

备注:
这里说的配置文件,都还是项目里面。最终都会被打进jar包里面的,需要注意。
1、如果同一个目录下,有application.yml也有application.properties,Springboot 2.4版本之前默认先读取application.properties,2.4版本之后的优先读取application.yml。
2、如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。
3、创建SpringBoot项目时,一般的配置文件放置在“项目的resources目录下”

如果我们的配置文件名字不叫application.properties或者application.yml,可以通过以下参数来指定配置文件的名字,myproject是配置文件名
$ java -jar myproject.jar --spring.config.name=myproject
我们同时也可以指定其他位置的配置文件来生效
java -jar run-0.0.1-SNAPSHOT.jar -- spring.config.location=D:/application.properties

4.2 配置文件属性注入

使用Spring Boot全局配置文件设置属性时:
如果配置属性是Spring Boot已有属性,例如服务端口server.port,那么Spring Boot内部会自动扫描并读取这些配置文件中的属性值并覆盖默认属性。
如果配置的属性是用户自定义属性,例如刚刚自定义的User实体类属性,还必须在程序中注入这些配置属性方可生效。

  • @Configuration:声明一个类作为配置类
  • @Bean:声明在方法上,将方法的返回值加入Bean容器
  • @Value:属性注入
  • @ConfigurationProperties(prefix = "jdbc"):批量属性注入
  • @PropertySource("classpath:/jdbc.properties")指定外部属性文件。在类上添加
    比如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

配置数据源

  • @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 提供的一个注解,使用该注解用于启用应用对另外一个注解 @ConfigurationProperties 的支持,,用于设置一组使用了注解@ConfigurationProperties 的类,用于作为 bean 定义注册到容器中。
或者

@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使用一些宽松的规则将环境属性绑定到@ConfigurationProperties bean,因此环境属性名和bean属性名之间不需要完全匹配
例如

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

owner.first-name 羊肉串模式case, 推荐使用
owner.firstName 标准驼峰模式
owner.first_name 下划线模式
OWNER_FIRSTNAME 大写下划线,如果使用系统环境时候推荐使用

6. 日志框架

Springboot 默认已经使用了 SLF4J(日志抽象层) + LogBack(日志实现层)记录日志
自定义日志输出

# 日志配置
# 指定具体包的日志级别
logging.level.com.lagou=debug
# 控制台和日志文件输出格式
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
# 日志输出路径,默认文件spring.log
logging.file.path=spring.log
#logging.file.name=log.log

SpringBoot数据源配置

7.配置数据源

在application.properties中配置数据库连接

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中引入依赖

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

在application.yml中引入druid的相关配置

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数据源
 type: com.alibaba.druid.pool.DruidDataSource
  # 数据源其他配置
 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
  # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
 filters: stat,wall,log4j
 maxPoolPreparedStatementPerConnectionSize: 20
 useGlobalDataSourceStat: true
 connectionProperties:
druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

如果单纯在yml文件中编写如上的配置,SpringBoot肯定是读取不到druid的相关配置
的。因为它并不像我们原生的jdbc,系统默认就使用DataSourceProperties与其属性进行了绑
定。所以我们应该编写一个类与其属性进行绑定

编写整合druid的配置类DruidConfig

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

因为我们springBoot2.0以后使用的日志框架已经不再使用log4j了。此时应该引入相应的适配器。
我们可以在pom.xml文件上加入

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

7.2 整合mybatis

新建springboot项目,并导入mybatis的pom配置

<!-- 配置数据库驱动和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数据源
 type: com.alibaba.druid.pool.DruidDataSource

总结
现在为止我们就可以使用我们创建的SpringBoot框架了,我们可以集成项目中需要的其他框架或者中间件。方便了我们的开发,不用做哪些繁琐的xml配置。在学习spring的时候感觉很复杂,使用Springboot以后感觉方便了很多。当然他还是基于spring来开发的,还是需要了解到spring的原理才能更好的应用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容