Spring Boot快速入门
Spring boot
一、Spring Boot 介绍
1.1 引言
- 为了使用 ssm 框架去开发,准备 ssm 框架的模块配置
- 为了 spring 整合第三方框架,单独写 xml 配置文件
- 导致 ssm 项目后期 xml 文件特别多,维护 xml 文件的成本很高
- ssm 部署也是很麻烦的,依赖第三方的容器
- ssm 开发方式很笨重
1.2 spring boot 介绍
SpringBoot 是由 Privota 团队研发的,SpringBoot 并不是一门技术,只是将之前常用的 Spring,SpringMVC,data-jpa 等常用的框架封装到了一起,并隐藏了这些框架的整合细节,实现敏捷开发
Spring Boot 就是一个工具类。
1.3 Spring Boot 的特点
- Spring Boot 项目不需要模板化的配置
- 在 Spring Boot 中整合第三方的框架是,只需要导入相应的 starter 依赖包,就自动整合了
- Spring Boot 默认只有一个.properties 的配置文件,不推荐使用 xml, 后期会采用,.java 文件去编写配置信息
- SpringBoot 工程部署时,采用的是 jar 包的方式,内部自动依赖 Tomcat 容器,提供了多环境的配置。
- 后期要学习的微服务框架 Spring Cloud 需要建立在 Spring Boot 的基础上。
二、Spring Boot 快速入门
2.1 快速构建 Spring Boot 工程
- 选择项目的构建类型
- 项目的描述
- 指定版本和需要的依赖
第一次构建 springboot 项目时,会下载大量的依赖,要保证 Maven 配置了阿里云的私服
- 修改 pom.xml 的依赖
<dependency>-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 将上面修改成下面 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
- 编写一个 testController 的类
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController()
public class Testcontroller {
<span class="hljs-meta">@GetMapping("test")</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">test</span><span class="hljs-params">()</span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">"Hello SpringBoot!"</span>;
}
}
- 启动过程,启动 main 的方法
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class FirstSpringbootApplication {
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">main</span><span class="hljs-params">(String[] args)</span> {
SpringApplication.run(FirstSpringbootApplication.class, args);
}
}
2.2 spring boot 工程中的目录结构
- pom.xml 文件
- 指定了一个父工程,指定了当前工程中为 springboot,帮助我们声明了 starter 依赖的版本
- 项目的元数据:包名,项目名,版本号
- 指定了 properties 信息:指定了 java 的版本 1.8
- 导入依赖:默认情况下导入 spring-boot-starter, spring-boot-starter-test
- 插件:spring-boot-maven-plugin
- .gittignore 文件:默认帮助我们忽略了一些文件和目录
- src 目录
- src
- main
- java
- 包名
启动类.java # 需要将controller类,放在启动类的子类包中或者同级包下
- resources
- static # 存放静态资源的
- templates # 存储模板页面的
application.porperties # SpringBoot提供的唯一的配置文件
- test # 测试用的
2.3 三种启动方式
运行启动类的 main 方法即可运行 springboot 工程
采用 maven 的命令去运行 spring Boot 工程
mvn spring-boot:run
- 采用 jar 包的方式运行
将当前的项目打包成一个 jar 文件
mvn clean package
通过 java -jar jar 文件
三、Spring Boot 常用注解
3.1 @Configuration 和 @Bean
之前使用 ssm 去开发的时候,在 xml 文件中编写 bean 标签。
但是 spring boot 不推荐使用 xml 文件
@configuration 注解相当于 beans 标签
@Bean 注解相当于 bean 标签
id="方法名 | 注解中的 name 属性(优先级更高)"
class="方法的放回结果"
@Configuration // 代表当前类是一个配置类
public class UserConfig {
<span class="hljs-meta">@Bean(name = "user1")</span>
<span class="hljs-keyword">public</span> User <span class="hljs-title function_">user</span><span class="hljs-params">()</span>{
<span class="hljs-type">User</span> <span class="hljs-variable">user</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">User</span>();
user.setId(<span class="hljs-number">1</span>);
user.setName(<span class="hljs-string">"张三"</span>);
<span class="hljs-keyword">return</span> user;
}
<span class="hljs-comment">/*
<beans .....> @Configuration
@Bean
<bean id="user1" class"com.gopan.firstspringboot.entity.User">
</beans>
*/</span>
}
3.2 @SpringBootApplication
@SpringBootApplication 是一个组合注解
- @SpringBootConfiguration 就是 @Comfiguration 注解,代表我的启动类激素 hi 一个配置类
- @EnableAutoConfiguration 帮你实现自动装配的,SpringBoot 工程启动时,运行一个 SpringFactoriesLoader 的类,加载 META-INF/spring.factories 配置类(已经开启的),通过 SpringFactoriesLoader 中的 load 方法,以 For 循环的方式,一个一个地加载。
好处:无需编写大量的整合配置信息,只需要按照 SpringBoot 提供好了约定去整合即可。
坏处:如果导入了 starter 依赖,那么你就需要填写他必要的配置信息。
手动关闭自动装配指定内容
@SpringBootApplication(exclude = QuartzAutoConfiguration.class)
- @ComponentScan 就相当于 <context:component-scan basePackage="包名"/>
帮助扫描注解的
四、Spring Boot 常用·配置
4.1 Spring Boot 的配置文件的格式
SpringBoot 的配置文件支持 properties 和 yml, 甚至还支持 json
更推荐使用 yml 文件格式:
yml 文件 会根据换行和缩进帮助咱们管理配置文件的所在位置。
使用 properties 文件配置很难管理,需要手动管理
yml 文件,相比于 properties 更轻量级一些
yml 文件的劣势:
- 严格遵循换行和所缩进
- 在填写 value 时,一定要在:后面跟上空格
4.2 多环境配置
在 application.yml 文件中添加一个配置项:
spring: profiles: active: 环境名
在 resourcea 目录下,创建多个 application- 环境名.yml 即可
在部署工程时,通过 java -jar 文件 - - spring.profiles.active = 环境名
4.2 引入外部配置文件信息
和传统的 ssm 的方式一样,通过 @value 的注解去获取 properties/yml 文件中的内容
如果在 yml 文件中需要编写大量的自定义的配置,并且具有统一的前缀时,可以采用下方方式
@ConfigurationProperties(prefix = "aliyun")
@Component
@Data
public class AliyunProperities {
<span class="hljs-keyword">private</span> String xxxx;
...
}
aliyun:
xxxx: xxxxxxxx
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
4.4 热加载
- 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
- 修改 settings 中的配置
- 修改内容后,可以通过 build 重新构建工程
五、Spring Boot 整合 Mybits
5.1 xml 方式整合 Mybatis
- 导入依赖
<!-- mysql 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- druid 连接 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<span class="hljs-comment"><!-- mybatis--></span>
<span class="hljs-comment"><!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter --></span>
<span class="hljs-tag"><<span class="hljs-name">dependency</span>></span>
<span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.mybatis.spring.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>mybatis-spring-boot-starter<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span>
<span class="hljs-tag"><<span class="hljs-name">version</span>></span>1.3.2<span class="hljs-tag"></<span class="hljs-name">version</span>></span>
<span class="hljs-tag"></<span class="hljs-name">dependency</span>></span>
- 编写配置文件
// 1. 准备实体类
@Data
public class Air {
private long id;
private long districtId;
private java.sql.Date monitorTime;
private long pm10;
private long pm25;
private String monitoringStation;
private java.sql.Date lastModifyTime;
}
// ----------------------------------------
@Data
public class District {
private long id;
private String name;
}
// 2.2 准备 Mapper 接口
public interface AirMapper {
List<Air> findAll();
}
// 在启动类中添加直接,扫描 Mapper 接口所在的包
@MapperScan(basePackages = "com.gopan.firstspringboot.mapper")
<!-- 2.3 准备映射文件 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gopan.firstspringboot.mapper.AirMapper">
<!-- List<Air> findAll();-->
<select id="findAll" resultType="Air">
select * from air
</select>
</mapper>
# 添加 yml 文件的配置信息
# Mybatis 配置
mybatis:
# 扫描映射的文件
mapper-locations: classpath:mapper/*.xml
# 配置别名扫描的包
type-aliases-package: com.gopan.firstspringboot.entity
configuration:
# 开启驼峰映射
map-underscore-to-camel-case: true
# 2.3 指定连接数据库的信息
# 连接数据库的信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///air?serverTimezone=UTC
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
- 测试
在 Mapper 接口的位置,直接右键 -> goto -> Test
会自动创建当前的接口的测试类,在 test 目录下。
让当前的测试类,继承 FirstSpringbootApplicationTests 测试类(在 class 前添加,public)
class AirMapperTest extends FirstSpringbootApplicationTests {
@Autowired
private AirMapper airMapper;
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">void</span> <span class="hljs-title function_">findAll</span><span class="hljs-params">()</span> {
List<Air> list = airMapper.findAll();
<span class="hljs-keyword">for</span> (Air air : list) {
System.out.println(air);
}
}
}
5.2 注解方式整合 Mybatis
- 创建 District 的 Mapper 接口
public interface DistrictMapper {
List<District> findAll();
}
- 添加 Mybatis 注解
针对增删改查:@Insert @Delete @Update @Select
还是需要在启动类中添加 @MapperScan 注解
public interface DistrictMapper {
<span class="hljs-meta">@Select("select * from district")</span>
List<District> <span class="hljs-title function_">findAll</span><span class="hljs-params">()</span>;
<span class="hljs-meta">@Select("select * from district where id = #{id}")</span>
District <span class="hljs-title function_">findOneById</span><span class="hljs-params">(<span class="hljs-meta">@Param("id")</span> Integer id)</span>;
}
- 测试,看到执行的 sql 语句
# 查看 sql 语句
logging:
level:
com.gopan.firstspringboot.mapper: DEBUG
class DistrictMapperTest extends FirstSpringbootApplicationTests {
<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> DistrictMapper mapper;
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">void</span> <span class="hljs-title function_">findAll</span><span class="hljs-params">()</span> {
List<District> list = mapper.findAll();
<span class="hljs-keyword">for</span> (District district : list) {
System.out.println(district);
}
}
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">void</span> <span class="hljs-title function_">findOneById</span><span class="hljs-params">()</span> {
<span class="hljs-type">District</span> <span class="hljs-variable">dis</span> <span class="hljs-operator">=</span> mapper.findOneById(<span class="hljs-number">5</span>);
System.out.println(dis);
}
}
5.3 SpringBoot 整合分页助手
- 导入依赖
<!-- pageHelper 依赖 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
- 测试使用
@Test
public void findByPaage(){
// 1. 执行分页
PageHelper.startPage(1,1);
<span class="hljs-comment">// 2. 执行查询</span>
List<Air> list = airMapper.findAll();
<span class="hljs-comment">// 3. 封装PageInfo对象</span>
PageInfo<Air> pageInfo = <span class="hljs-keyword">new</span> <span class="hljs-title class_">PageInfo</span><>(list);
<span class="hljs-comment">// 4. 输出</span>
<span class="hljs-keyword">for</span> (Air air : pageInfo.getList()) {
System.out.println(air);
}
}