一、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项目。
- 创建Spring Initializr项目。
这里注意要勾选上Web项目。
首次创建的话,idea回去下载所需要的依赖,这里耐心等待一下即可。以后再创建时就会很快。
- 引导类
创建成功后,我们会发现IDEA已经自动帮我们创建好了一个类,并且该类有@SpringBootApplication注解,这是整个springboot的核心注解,它的目的就是开启springboot的自动配置。这个类是我们整个项目的入口类称为引导类。 - 创建Controller类
这里用到了springMVC。 - 测试
执行引导类的主方法。控制台打印如下信息
由图中标记可知,springboot内置的Tomcat启动的端口是8080。我们打开浏览器输入:localhost:8080/quick
遇到了错误,错误信息说我们没有访问正确的页面。但是经过检查发现输入的地址无误,后来发现是引导类的路径问题,该类只能在根路径下。
修改完路径后进行测试
到此一个简单的springboot工程就创建出来了。
三、原理简单分析
打开springboot项目下的pom.xml
- 起步依赖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>
- 自动配置@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)文件。
- 基本的配置修改
在application.properties中加入以下配置就可以修改Tomcat项目启动时的端口号和项目访问的路径
server.port=8888
server.servlet.context-path=demo
- 配置文件与配置类的属性映射方式
- 使用注解@Value映射
- 使用注解@ConfigurationProperties映射
五、springboot整合其他技术
这里以springboot整合mybatis为例,其实整合都大同小异,
- 在pom.xml中添加mybatis起步依赖
<!--mybatis起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
- 添加数据库驱动坐标
<!-- MySQL连接驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
- 添加数据库连接信息
在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
- 创建表
在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', '李四');
- 创建实体Bean
建一个domain包,创建user表单的实体类。 - 建一个mapper包,创建UserMapper类。
@Mapper注解标记该类是一个mybatis的mapper接口,可以被springboot自动扫描到spring上下文中
- 配置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>
- 在application.properties中添加mybatis的信息
#spring集成Mybatis环境
#pojo别名扫描包
mybatis.type-aliases-package=top.wwqi.domain
#加载Mybatis映射文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
- 编写测试Controller
这里的 private UserMapper userMapper
报错,原因是这里用到了注解@Autowired,在启动项目时才会为属性UserMapper自动注入,项目没运行时就没有注入,不算真正意义上的错误,可以正常运行。
- 测试
启动项目引导类的main方法。浏览器中上输入:localhost:8080/query发现又报错,错误信息如下
打开idea控制台,异常信息如下,可知是关于mybatis的代码出错,原因是未找到…
通过一番查找后发现是映射关系的问题,方法名与 select id 没写一致。
修改后再次运行
到此整合mybatis就成功了。
补充: springboot 工程热部署
热部署:在程序运行中,修改项目代码后,idea可以自动加载并运行修改后的项目。无需关闭再启动该服务。主要是为了方便程序的开发。
方法:添加热部署依赖即可。
<!--热部署配置-->
<dependency>
<groupId>org.springframwork.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>