一、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

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


    修改完路径后进行测试

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

三、原理简单分析

打开springboot项目下的pom.xml

  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

    再进入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>  
    
  2. 自动配置@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
    
  2. 配置文件与配置类的属性映射方式

  3. 使用注解@Value映射

  4. 使用注解@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>
    
  2. 添加数据库驱动坐标

    <!-- MySQL连接驱动 -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    </dependency>
    
  3. 添加数据库连接信息

    在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
    
  4. 创建表

    在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', '李四');
    
  5. 创建实体Bean

    建一个domain包,创建user表单的实体类。

  6. 建一个mapper包,创建UserMapper类。

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

  7. 配置Mapper映射文件

    在src\main\resources\mapper路径下加入UserMapper.xml配置文件

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis//DTD Mapper 3.0//EN"
            "http://mybatis/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="top.wwqi.mapper.UserMapper">
        <select id="queryUserList" resultType="user">
            select * from user
        </select>
    </mapper>
    
  8. 在application.properties中添加mybatis的信息

    #spring集成Mybatis环境
    #pojo别名扫描包
    mybatis.type-aliases-package=top.wwqi.domain
    #加载Mybatis映射文件
    mybatis.mapper-locations=classpath:mapper/*Mapper.xml
    
  9. 编写测试Controller

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

  10. 测试

    启动项目引导类的main方法。浏览器中上输入:localhost:8080/query发现又报错,错误信息如下

    打开idea控制台,异常信息如下,可知是关于mybatis的代码出错,原因是未找到…

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

    修改后再次运行

    到此整合mybatis就成功了。

    补充: springboot 工程热部署

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

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

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

更多推荐

springboot菜鸟入门