ssm:https://www.bilibili.com/video/BV1Fi4y1S7ix/
SpringBoot2:https://www.bilibili.com/video/BV15b4y1a7yG/
1、概述
- Spring配置繁琐,依赖设置繁琐;SpringBoot可以简化Spring的初始搭建和开发过程
- SpringBoot优点:自动配置。起步依赖,辅助功能(内置tomcat服务器等)
- 最简SpringBoot程序所包含的基础文件:pom.xml文件和Application类
- SpringBoot官网(https://start.spring.io/)能快速创建SpringBoot项目
启动类
启动类是Boot工程的执行入口,运行main方法就可以启动项目,SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean
2、配置说明
SpringBoot提供了多种属性配置方式,其中
.properties
>.yml
>.yaml
;共存叠加
.yml
是一种数据学序列化格式,数据存储格式;容易与脚本语言交互,以数据为核心,轻格式
.yml
语法规则:
- 大小写敏感;属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格;属性值前面添加空格
#
表示注释
改端口
#application.properties
server.port=80
#application.yml
server:
port: 81
#application.yaml
server :
port: 82
日志输出
logging.level.root = debug
logging.level.com.lm = warn
yml文件例子
user:
name:aa
age:1
----------------
a:
b:
c:
----------------
# 数组
likes:
- game
- music
----------------
likes:[game,music]
----------------
# 对象
users:
-
name:zs
age:12
-
name:ls
age:13
----------------
users:[{name:zs,age:12},{name:ls,age:13}]
----------------
date: 2018-02-09
datetime: 2018-02-17-T15:02:31+08:00
null:~
获取配置数据
lesson: SpringBoot
server:
port: 80
enterprice:
name: lm
age: 20
subject:
- java
- 前端
- 使用@Value读取单个数据
- Environment对象读取全部数据
import org.springframework.core.env.Environment
@RestController
@RequestMapper("/books")
public class BookController{
@Value("${lesson}")
private String lesson;
@Value("${server.port}")
private Integer port;
@Value("${enterprice.subject[0]}")
private String subject_00;
@Autowired
private Environment environment;
@GetMapper("/{id}")
public String getById(@PathVariable Integer id){
System.out.print(environment.getProperty("lesson"));
System.out.print(environment.getProperty("sever.port"));
System.out.print(environment.getProperty("enterprice.subject[0]"));
}
}
定义一个实体类封装指定数据,自定义对象封装指定数据;按照对象的形式读出来:可以将配置快速转成配置对象
- @Component定义为spring管控的bean;由spring帮我们去加载数据到对象中
- @ConfigurationProperties配置属性,指定要加载的数据,绑定配置信息到封装类中【当前对象从配置中读属性】
@Component
@ConfigurationProperties(prefix = "enterprise")
public class Enterprise {
private String name;
private Integer age;
private String[] subject;
}
@RestController
@RequestMapper("/books")
public class BookController{
@Autowired
private Enterprise enterprise;
@GetMapper("/{id}")
public String getById(@PathVariable Integer id){
System.out.println(enterprise);
}
}
自定义对象封装数据警告解决
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
变量引用!!!
baseDir: c:\windows
tempDir: ${baseDir}\temp # ${属性名}引用属性 c:\windows\temp
tempDir: "${baseDir}\temp" # 解析\t,转义字符生效 c:\windows emp
这些是YAML格式的配置示例,它们定义了一些属性并进行了引用。
-
baseDir: c:\windows
:这一行定义了一个属性baseDir
,它的值是c:\windows
。这表示基础目录在Windows操作系统中为C:\Windows
。 -
tempDir: ${baseDir}\temp
:这一行定义了一个属性tempDir
,它的值使用了${baseDir}
来引用先前定义的baseDir
属性。${baseDir}
将会被解析为其对应的值,即c:\windows
,所以整个表达式解析后为c:\windows\temp
。这表示临时目录为C:\Windows\temp
。 -
tempDir: "${baseDir}\temp"
:与第二个示例类似,但是使用了双引号将整个值括起来。在YAML中,使用双引号可以防止特殊字符的转义。因此,即使\t
看起来像是一个转义字符(代表制表符),但由于双引号的存在,它将被当作两个字符处理,所以最终的值会保留\t
而不是将其解释为制表符。所以这行实际表示的值是c:\windows\temp
,并且\t
不会被解析为制表符。
总之,这些示例展示了如何在YAML配置中定义属性以及如何引用先前定义的属性,并展示了如何使用双引号来保留特殊字符的原始值。
3、依赖说明
jetty服务器
内嵌Tomcat是SpringBoot的辅助功能之一,将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理
jetty更轻量级,负载性能低,undertow和tomcat差不多
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactedId>spring-boot-starter-web</artifactedId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactedId>spring-boot-starter-tomcat</artifactedId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactedId>spring-boot-starter-jetty</artifactedId>
</dependency>
4、注解说明
@RestController 是@controller和@ResponseBody 的结合
@Controller 将当前修饰的类注入SpringBoot IOC容器,使得从该类所在的项目跑起来的过程中,这个类就被实例化。
@ResponseBody 类中所有的API接口返回的数据,不论Map或是其他Object,它会以Json字符串的形式返回给客户端
@PathVariable 可以将 URL 中占位符参数绑定到控制器方法的形参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的形参中。
@Repository写在数据层上的,把类定义为一个bean,和@Component一样
5、整合说明
整合Mybatis
- SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区或在MySQL数据库端配置时区
因为强制使用的是MySQL8的驱动,强制要求设置时区
服务器时区:
url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
驱动类过时:
driver-class-name: com.mysql.cj.jdbc.Driver
映射配置: (XML/注解)【核心配置: 数据库连接相关信息】
- 定义数据层接口写sql语句并映射配置@Mapper
- 定义类与表头信息一致并测试
整合Mybatis-Plus
idea创建boot项目时换一个网址:https://start.aliyun.com或maven工程导入对应依赖
#配置mp相关配置,指定表名开头
mybatis-plus:
global-config:
db-config:
table-prefix: tb1_
整合Druid
druid-spring-boot-starter
# 方法1
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
# 方法2(推荐)
spring:
datasource:
druid:
driver-class-name: ...
Spring整合JUnit
@RunWith(SpringJUint4ClassRunner.class) //设置运行器
@ContextConfiguration(classes = SpringConfig.class) // 加载环境
public class xxxText{
@Autowired
private A a;
@Test
public void testSave(){
a.save();
}
}
SpringBoot整合JUnit
<dependency>
<groupId>org.springframewor.bootk</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
启动类就起到了配置类的作用,他会把他所在的包及子包扫描一遍;测试类会默认加载引导类,初始化spring的环境
测试类会加载同层包下的带有@SpringBootApplication里的@SpringBootConfiguration里的配置信息
如果测试类在SpringBoot启动类的包或子包中,可以省略启动类的设置,也就是省略classes的设定,如果不在一个包下就指定参数
@SpringBootTest(classes = 引导类名.class)
@SpringBootTest
class test{
@Autowired
private A a;
@Test
public void save(){
a.save();
}
}
Spring整合Mybatis
SpringConfig:导入JdbcConfig,导入MyBatisConfig
@Configuration
@ComponentScan("com.itheima")
@PropertySource("classpath;jdbc.properties")
@Import({JdbcConfig.class,MyBatisConfig.class}
public class SpringConfig {
}
JDBCConfig;定义数据源(加载properties配置项: driver、url、username、password)
jdbc.properties配置文件
public class JdbcConfig {
@Value("$jdbc.driver}")
private String driver;
@Value("${jdbc.ur1}")
private String url;
@Value("${jdbc.username}")
private String userName ;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource getDataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUr1(ur1);
ds.setUsername(userName);
ds.setPassword(password);
return ds;
}
}
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_db
jdbc.username=root
jdbc.password=1234
MyBatisConfig:定义SqlSessionFactoryBea,定义映射配置
@Bean
public SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setTypeAliasesPackage("com.itheima.comain");
ssfb.setDataSource(dataSource);
return ssfb;
}
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.itheima.dao");
return msc;
}
SpringBoot整合mybatis
SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区或在MySQL数据库端配置时区
加个@Mapper就可以
<dependency>
<groupId>org.mybatis.spring.boot</groupId
><artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url:jdbc:mysql: //localhost:3306/ssm_db?serverTimezone=UTC
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
6、多环境开发
使用---
区分多环境
yml配置格式
#设置启用的环境
spring:
profiles:
active: dev
---
#开发
spring:
config:
activate:
no-profiles: dev
server:
port: 8080
---
#生产
spring:
config:
activate:
no-profiles: pro
server:
port: 8081
---
#测试
spring:
config:
activate:
no-profiles: test
server:
port: 8082
properties配置格式
主配置文件application.properties:
#设置启用的环境
spring.profiles.active=dev
环境分类配置文件application-dev.properties:
server.port=8080
环境分类配置文件application-pro.properties:
server.port=8081
环境分类配置文件application-test.properties:
server.port=8082
多环境命令行启动参数配置
- 当配置中有中文,idea改成utf-8
- 带参数启动SpringBoot优先级较高
测试环境:
java -jar 文件名.jar --spirng.profiles.active=test
临时改端口:
java -jar 文件名.jar --spirng.profiles.active=test --server.port=88
多环境开发兼容问题(maven/boot)
都配置多环境开发时的兼容问题
boot应该听从maven的设定,maven传递的属性:maven中设置多环境属性xml,SpringBoot中引用maven属性yml
资源文件处理的插件
解析
{}
,加载yml里的配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<encoding>UTF-8</encoding>
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin>
pom.xml
<!--多环境-->
<profiles>
<!--开发环境-->
<profile>
<id>dev</id>
<properties>
<profile.active>dev</profile.active>
</properties>
</profile>
<!--生产环境-->
<profile>
<id>pro</id>
<properties>
<profile.active>pro</profile.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--测试环境-->
<profile>
<id>test</id>
<properties>
<profile.active>test</profile.active>
</properties>
</profile>
</profiles>
修改yml
spring:
profiles:
active: ${profile.active}
配置文件分类
测试时要修改的临时属性太多
java xxxxxxxx --xxx --xxx --xxx --xxx
,使用配置文件启动1级与2级留做系统打包后设置通用属性(上线);3级与4级用于系统开发阶段设置通用属性(开发)
SpringBoot中的4种配置文件
- file : config/application.yml(最高)(jar包同级目录)
- file : application.yml
- classpath: config/application.yml
- classpath: application.yml(最普通的配置文件)