一、spring与springboot

1.1 spring的优缺点

  • 优点:spring是JEE(java企业版)的轻量级代替品 ,通过IOC、AOP、DI为企业级java开发提供了一种相对简单的方法
  • 缺点:
  • 配置繁琐。一开始Spring是通过xml配置,后来Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置。
  • 项目的依赖管理费力。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,选错了依赖的版本会带来不兼容问题。

1.2 springboot对spring进行的优化

SpringBoot通过起步依赖和自动配置简化简化开发

springboot不是对spring的功能上的增强,而是提供一种快速使用Spring的方式。使用Springboot可以让我们快速创建一个基于Spring的项目,并且只需要很少的配置这个项目就可以跑起来。

在使用spring时多数情况下都是程序员通过添加大量的依赖和配置告诉spring框架该怎么做,而在一些情况下让张三来或让李四来做这些,他们配置的结果都是一样的,所以springboot基于约定优于配置的思想,让一些依赖固定在一起,通过继承starter帮助我们简化配置。

二、快速入门

这里以IDEA为例,创建一个SpringBoot项目。

  1. 创建Spring Initializr项目。


    这里注意要勾选上Web项目。

首次创建的话,idea回去下载所需要的依赖,这里耐心等待一下即可。以后再创建时就会很快。


  1. 引导类
    创建成功后,我们会发现IDEA已经自动帮我们创建好了一个类,并且该类有@SpringBootApplication注解,这是整个springboot的核心注解,它的目的就是开启springboot的自动配置。这个类是我们整个项目的入口类称为引导类。
  2. 创建Controller类
    这里用到了springMVC。
  3. 测试
    执行引导类的主方法。控制台打印如下信息

由图中标记可知,springboot内置的Tomcat启动的端口是8080。我们打开浏览器输入:localhost:8080/quick

springsecurity菜鸟教程 spring菜鸟教程pdf_spring boot

遇到了错误,错误信息说我们没有访问正确的页面。但是经过检查发现输入的地址无误,后来发现是引导类的路径问题,该类只能在根路径下。

springsecurity菜鸟教程 spring菜鸟教程pdf_spring boot_02


springsecurity菜鸟教程 spring菜鸟教程pdf_java_03

修改完路径后进行测试

springsecurity菜鸟教程 spring菜鸟教程pdf_ci_04

到此一个简单的springboot工程就创建出来了。

三、原理简单分析

打开springboot项目下的pom.xml

springsecurity菜鸟教程 spring菜鸟教程pdf_springsecurity菜鸟教程_05

  1. 起步依赖spring-boot-starter-parent分析
<!--springboot项目的要求,要继承SpringBoot的起步依赖spring-boot-starter-parent-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.4.RELEASE</version>
</parent>

在IDEA中通过Ctrl+鼠标左击spring-boot-starter-parent跳转到它的的pom.xml配置文件,可以看到它继承了spring-boot-dependencies

springsecurity菜鸟教程 spring菜鸟教程pdf_spring boot_06

再进入spring-boot-dependencies的pom.xml配置文件,在properties、dependencies和plugins标签下我们可以看到已经定义好了一部分坐标的版本、依赖管理、插件管理。所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了。说明了起步依赖的作用就是进行依赖的传递。

只摘录了一部分
<properties>
  <activemq.version>5.15.13</activemq.version>
  <antlr2.version>2.7.7</antlr2.version>
  <aspectj.version>1.9.6</aspectj.version>
  ......
</properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-amqp</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-blueprint</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      ......
    </dependencies> 
  </dependencyManagement>
<build>
      <plugins>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>build-helper-maven-plugin</artifactId>
          <version>${build-helper-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>exec-maven-plugin</artifactId>
          <version>${exec-maven-plugin.version}</version>
        </plugin>
        .......
<build>
  1. 自动配置@SpringBootApplication分析
    进入@SpringBootApplication源码

可以看到该注解是一个组合注解。它组合了@SpringBootConfiguration、@EnableAutoConfiguration以及@ComponentScan,我们在开发的过程中如果不使用@SpringBootApplication,则可以组合使用这三个注解。这三个注解中,@SpringBootConfiguration实际上就是@Configuration注解,表明这个类是一个配置类。@EnableAutoConfiguration则表示让springboot根据类路径中的jar包依赖为当前项目进行自动配置,最后一个@ComponentScan的作用就是开启扫描,唯一要注意的是如果我们使用了@SpringBootApplication注解的话,系统会去引导类的同级包以及下级包中去扫描实体类,因此我们建议入口类的位置在groupId+arctifactID组合的包名下。

四、配置文件application.*

SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置。
SpringBoot默认会从resources目录下加载application.properties或application.yml(application.yaml)文件。

  1. 基本的配置修改
    在application.properties中加入以下配置就可以修改Tomcat项目启动时的端口号和项目访问的路径
server.port=8888
server.servlet.context-path=demo
  1. 配置文件与配置类的属性映射方式
  2. 使用注解@Value映射
  3. 使用注解@ConfigurationProperties映射

五、springboot整合其他技术

这里以springboot整合mybatis为例,其实整合都大同小异,

  1. 在pom.xml中添加mybatis起步依赖
<!--mybatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
  1. 添加数据库驱动坐标
<!-- MySQL连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
  1. 添加数据库连接信息
    在resources/application.properties中添加数据库的连接信息
#数据库配置:
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
  1. 创建表
    在test数据库中创建user表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`username` varchar(50) DEFAULT NULL,
	`password` varchar(50) DEFAULT NULL,
	`name` varchar(50) DEFAULT NULL,
	PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '张三');
INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四');
  1. 创建实体Bean
    建一个domain包,创建user表单的实体类。
  2. 建一个mapper包,创建UserMapper类。

@Mapper注解标记该类是一个mybatis的mapper接口,可以被springboot自动扫描到spring上下文中

  1. 配置Mapper映射文件
    在src\main\resources\mapper路径下加入UserMapper.xml配置文件
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="top.wwqi.mapper.UserMapper">
    <select id="queryUserList" resultType="user">
        select * from user
    </select>
</mapper>
  1. 在application.properties中添加mybatis的信息
#spring集成Mybatis环境
#pojo别名扫描包
mybatis.type-aliases-package=top.wwqi.domain
#加载Mybatis映射文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
  1. 编写测试Controller

这里的 private UserMapper userMapper 报错,原因是这里用到了注解@Autowired,在启动项目时才会为属性UserMapper自动注入,项目没运行时就没有注入,不算真正意义上的错误,可以正常运行。

  1. 测试
    启动项目引导类的main方法。浏览器中上输入:localhost:8080/query发现又报错,错误信息如下
    打开idea控制台,异常信息如下,可知是关于mybatis的代码出错,原因是未找到…

通过一番查找后发现是映射关系的问题,方法名与 select id 没写一致。

springsecurity菜鸟教程 spring菜鸟教程pdf_spring boot_07

修改后再次运行

springsecurity菜鸟教程 spring菜鸟教程pdf_spring_08

到此整合mybatis就成功了。

补充: springboot 工程热部署

热部署:在程序运行中,修改项目代码后,idea可以自动加载并运行修改后的项目。无需关闭再启动该服务。主要是为了方便程序的开发。

方法:添加热部署依赖即可。

<!--热部署配置-->
<dependency>
		<groupId>org.springframwork.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
</dependency>