目录
Spring Boot 概述
Spring Boot是一个便捷搭建 基于spring工程的脚手架;作用是帮助开发人员快速搭建大型的spring 项目。简化工程的配置,依赖管理;实现开发人员把时间都集中在业务开发上。
Spring Boot 入门
实现步骤:
- 创建工程
- 添加依赖(启动器依赖)
- 创建启动类
- 创建处理器Controller
- 测试
代码实现
- 创建工程
创建一个Maven工程
- 添加依赖 (spring-boot-starter-web )
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.6.6</version>
</parent>
<groupId>com.itheima</groupId>
<artifactId>heima-springboot</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
- 创建启动类
/* 这是一个启动器依赖,这是工厂的入口类 并在引导类上添加@SpringBootApplication */
@SpringBootApplication
public class Application {
public static void main(String[] args) {
//启动并告诉她引导类是谁
SpringApplication.run(Application.class,args);
}
}
- 创建处理区
//控制
@RestController
public class HelloController {
@GetMapping("hello")
public String hello(){
return "Hello,SpringBoot!";
}
}
java代码方式配置
比较常用的注解:
@Configuration :声明一个类作为配置类,代替xml文件
@Bean :声明在方法上,将方法的返回值加入Bean容器,代替 <bean> 标签
@Value :属性注入
@PropertySource :指定外部属性文件
使用Java配置数据库连接池
步骤
- 添加依赖
- 创建数据库
- 创建数据库连接参数的配置文件jdbc.properties
- 创建配置类
- 改造处理器类注入数据并使用
代码实现
步骤
- 添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
- 创建数据库
- 创建数据库连接参数的配置文件jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/health
jdbc.username=root
jdbc.password=123456
- 创建配置类(config)
@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.url}")
String url;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
- 改造处理器类注入数据并使用
@RestController
public class HelloController {
@Autowired
private DataSource dataSource;
@GetMapping("hello")
public String Hello(){
System.out.println(dataSource);
return "hello,springBoot!";
}
}
Spring Boot 属性注入方式
目标
- 能够使用@ConfigurationProperties实现Spring Boot配置文件配置项读取和应用
- 将配置文件中的配置想读取到一个对象中
实现
- 可以使用Spring Boot提供的注解@ConfigurationProperties,该注解可以将Spring Boot的配置文件(默认必须为application.properties或application.yml)中的配置项读取到一个对象中。
- 使用@ConfigurationProperties编写配置项类将配置文件中的配置项设置到对象中
实现步骤
- 创建配置项类JdbcProperties类,类名上添加@ConfigurationProperties
- 将jdbc.properties修改名称为application.properties
- 将JdbcProperties对象注入到JdbcConfig
代码实现
- 创建配置项类JdbcProperties类,类名上添加@ConfigurationProperties
@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {
private String driverClassName;
private String url;
private String username;
private String password;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
将jdbc.properties修改名称为application.properties
将JdbcProperties对象注入到JdbcConfig
@Configuration
EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfig {
@Bean
public DataSource dataSource(JdbcProperties jdbc){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(jdbc.getDriverClassName());
dataSource.setUrl(jdbc.getUrl());
dataSource.setUsername(jdbc.getUsername());
dataSource.setPassword(jdbc.getPassword());
return dataSource;
}
更优雅的注入
事实上,如果一段属性只有一个Bean需要使用,我们无需将其注入到一个类(JdbcProperties,将该类上的所有注解去掉)中。而是直接在需要的地方声明即可;再次修改 JdbcConfig 类为如下代码
@Bean
@ConfigurationProperties(prefix = "jdbc")
public DataSource dataSource(){
return new DruidDataSource();
}
多个yml文件配置
可以将多个yml文件在application.yml文件中配置激活
yaml与properties配置文件除了展示形式不相同以外,其它功能和作用都是一样的;在项目中原路的读取方式不需要改变。
yml配置文件的特征:
1. 树状层级结构展示配置项;
2. 配置项之间如果有关系的话需要分行空两格;
3. 配置项如果有值的话,那么需要在 `:`之后空一格再写配置项值;
yml
jdbc:
driverClassName: com.mysql.jdbc.Driver//这有一个空格
url: jdbc:mysql://127.0.0.1:3306/heima
username: root
password: root
key:
abc: cba
def:
- g
- h
- j
- 多个yml配置文件;在spring boot中是被允许的。这些配置文件的名称必须为application-***.yml,并且这些配置文件必须要在application.yml配置文件中激活之后才可以使用。
- 如果properties和yml配置文件同时存在在spring boot项目中;那么这两类配置文件都有效。在两个配置文件中如果存在同名的配置项的话会以properties文件的为主。在多个配置文件时,需要将这些文件在application.yml文件中进行激活:
激活配置文件;需要指定其它的配置文件名称
spring:
profiles:
active: abc,def
自动配置原理
目标:
了解Spring Boot项目的配置加载流程
小结
在 META-INF\spring.fatories
文件中定义了很多自动配置类;可以根据在pom.xml
文件中添加的 启动器依赖自动配置组件
通过如下流程可以去修改application配置文件,改变自动配置的组件默认参数
lombok应用
分析:
使用lombok的注解实现pojo类的简化 , 使用Spring Boot整合SSM工程;需要使用到数据库数据。
- 将数据库表数据导入到数据库中(springboot_test)
- 编写数据库表对应的实体类;一般情况下需要编写get/set/toString等这些方法会耗时并且会让实体类看起来比较臃肿。可以使用lombok插件对实体类进行简化
- lombok是一个插件工具类包;提供了一些注解@Data、@Getter等这些注解去简化实体类中的构造方法、get/set等方法的编写。
步骤:
- 在idea中安装lombok插件
- 添加lombok对应的依赖到Maven中
- 改造实体类使用lombok注解
小结
在Bean上使用:
@Data :自动提供getter和setter、hashCode、equals、toString等方法
@Getter:自动提供getter方法
@Setter:自动提供setter方法
@Slf4j:自动在bean中提供log变量,其实用的是slf4j的日志功能。
代码实现:
- 在idea中安装lombok插件
- 添加lombok对应的依赖到Maven中
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
- 改造实体类使用lombok注解
//在编译阶段会根据注解自动生成对应的方法;
// data包含get/set/hashCode/equals/toString等方法
@Data
public class User {
private Long id;
private String userName;
private String password;
private String name;
private Integer age;
private Integer sex;
private Date birthday;
private String note;
private Date created;
private Date updated;
}
Spring整合-SpringMVC
修改端口
修改tomcat端口:
- 查询**Properties,设置配置项(前缀+类变量名)到application配置文件中访问项目中的静态资源
- 静态资源放置的位置;放置静态资源并访问这些资源
#tomcat端口 server: port: 80
访问静态资源
在spring boot项目中静态资源可以放置在如下目录:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public
只要静态资源放在这些目录中任何一个,SpringMVC都会帮我们处理。
我们习惯会把静态资源放在 classpath:/static/ 目录下。
添加拦截器
实现思路
- 编写拦截器 (实现HandlerInterceptor)
- 编写配置类实现 WebMvcConfigurer,在该类中添加各种组件
代码实现
- 编写拦截器 (实现HandlerInterceptor)
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.debug("这是MyInterceptor拦截器的preHandle方法");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.debug("这是MyInterceptor拦截器的postHandle方法");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.debug("这是MyInterceptor拦截器的afterCompletion方法");
}
}
- 编写配置类实现 WebMvcConfigurer,在该类中添加各种组件
@Configuration
public class MvcConfig implements WebMvcConfigurer {
//注册拦截器
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
//添加拦截器到spring mvc拦截器链当中
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor()).addPathPatterns("/*");
}
}
结构组成
Spring整合-事务和连接池
目标:
配置Spring Boot自带默认的hikari数据库连接池和使用@Transactional注解进行事务配置
数据库连接池hikari配置,事务配置
基本思路:
- 添加事务相关的启动器依赖,mysql相关依赖;
- 编写业务类UserService使用事务注解@Transactional
代码实现:
- 添加事务相关的启动器依赖,mysql相关依赖;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
- 编写业务类UserService使用事务注解@Transactional
@Service
public class UserService {
//查询
public User getUserById(Long id){
return new User();
}
//新增用户
@Transactional
public void save(){
System.out.println("新增用户成功!!!");
}
}
Spring整合-Mybatis
目标:
配置Mybatis在Spring Boot工程中的整合包,设置mybatis的实体类别名,输出执行sql语句配置项
实现思路:
- 添加配置依赖
- 配置Mybatis:实体类别名包,日志,映射文件
- 配置MapperScan
代码实现:
- 添加配置依赖
<!--mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
- 配置Mybatis:实体类别名包,日志,映射文件
mybatis:
# 实体类别名包路径
type-aliases-package: com.itheima.pojo
# 映射文件路径
# mapper-locations: classpath:mappers/*.xml
#日志配置
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 配置MapperScan
Spring整合-通用Mapper
通用Mapper:
可以实现自动拼接sql语句;所有的mapper都不需要编写任何方法也就是不用编写sql语句。可以提高开发效率。
实现思路:
- 添加启动器依赖
- 改造UserMapper继承Mapper<T>
- 修改启动引导类Application中的Mapper扫描注解
- 修改User实体类添加jpa注解
- 改造UserService实现业务功能
代码实现 :
- 添加启动器依赖
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version>
</dependency>
- 改造UserMapper继承Mapper<T>
- 修改启动引导类Application中的Mapper扫描注解
- 修改User实体类添加jpa注解
- 改造UserService实现业务功能
Spring整合-Junit
目标:
在Spring Boot项目中使用Junit进行单元测试UserService的方法
实现:
添加启动器依赖spring-boot-starter-test
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
测试代码
在Spring Boot项目中如果编写测试类则必须要在类上面添加@SpringBootTest !!!
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void queryById() {
User user = userService.queryById(8L);
System.out.println("user = " + user);
}
@Test
public void saveUser() {
User user = new User();
user.setUserName("test2");
user.setName("test2");
user.setAge(13);
user.setPassword("123456");
user.setSex(1);
user.setCreated(new Date());
userService.saveUser(user);
}
}
Spring整合-redis
目标:
在Spring Boot项目中使用Junit测试RedisTemplate的使用
基本思路:
- 添加启动器依赖;spring-boot-starter-data-redis
- 配置application.yml中修改redis的连接参数;(redis需要启动)
- 编写测试类应用RedisTemplate操作redis中的5种数据类型(string/hash/list/set/sorted set)
代码实现:
- 添加启动器依赖;spring-boot-starter-data-redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置application.yml中修改redis的连接参数;(redis需要启动)
- 编写测试类应用RedisTemplate操作redis中的5种数据类型(string/hash/list/set/sorted set)
package com.itheima.redis;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Set;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test(){
//string字符串
//redisTemplate.opsForValue().set("str", "heima");
redisTemplate.boundValueOps("str").set("heima");
System.out.println("str = " + redisTemplate.opsForValue().get("str"));
//hash散列
redisTemplate.boundHashOps("h_key").put("name", "黑马");
redisTemplate.boundHashOps("h_key").put("age", 13);
//获取所有域对应的值
Set set = redisTemplate.boundHashOps("h_key").keys();
System.out.println("hash散列所有的域:" + set);
List list = redisTemplate.boundHashOps("h_key").values();
System.out.println("hash散列所有的域值:" + list);
//list列表
redisTemplate.boundListOps("l_key").leftPush("c");
redisTemplate.boundListOps("l_key").leftPush("b");
redisTemplate.boundListOps("l_key").leftPush("a");
list = redisTemplate.boundListOps("l_key").range(0, -1);
System.out.println("列表的值:" + list);
//set集合
redisTemplate.boundSetOps("set_key").add("a", "b", "c");
set = redisTemplate.boundSetOps("set_key").members();
System.out.println("集合的元素:" + set);
//sorted set有序集合
redisTemplate.boundZSetOps("z_key").add("a", 30);
redisTemplate.boundZSetOps("z_key").add("b", 20);
redisTemplate.boundZSetOps("z_key").add("c", 10);
set = redisTemplate.boundZSetOps("z_key").range(0, -1);
System.out.println("有序集合的元素:" + set);
}
}
Spring Boot项目部署
目标:
将Spring Boot项目使用maven指令打成jar包并运行测试
基本思路:
- 需要添加打包组件将项目中的资源、配置、依赖包打到一个jar包中;可以使用maven的
package
- 部署:java -jar 包名
代码实现:
- 需要添加打包组件将项目中的资源、配置、依赖包打到一个jar包中;可以使用maven的
package
<build> <plugins> <!-- 打jar包时如果不配置该插件,打出来的jar包没有清单文件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
- 部署:java -jar 包名
- 运行
运行打出来的包;使用命令: java –jar 包全名 或者写一个 bat 文件,里面包含 java –jar 包全名;这样就可以双击启动应用。
java -jar heima-springboot-1.0-SNAPSHOT.jar