Springboot
简介
简化Spring应用开发的一个框架;
整个Spring技术栈的一个大整合;
J2EE开发的一站式解决方案;
微服务
微服务:架构风格(服务微化)
一个应用应该是一组小型服务;可以通过HTTP的方式进行互通;
单体应用:ALL IN ONE
微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元;
部署
<!‐‐ 这个插件,可以将应用打包成一个可执行的jar包;‐‐>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐maven‐plugin</artifactId>
</plugin>
</plugins>
</build>
将这个应用打成jar包,直接使用java -jar的命令进行执行;
启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐web</artifactId>
</dependency>
Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter
相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器
注解
@SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
// Spring应用启动起来
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
@Controller
@ResponseBody
@RequestMapping("/hello")
@Controller//控制层
public class HelloController {
@ResponseBody //不跳转 return 数据
@RequestMapping("/hello") //配置url地址
public String hello(){
return "Hello World!";
}
}
@SpringBootConfiguration:Spring Boot的配置类;
@Bean给容器中添加组件
@Configuration
public class MyAppConfig {
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
@Bean
public HelloService helloService02(){
System.out.println("配置类@Bean给容器中添加组件了...
");
return new HelloService();
}
}
@Configuration:配置类上来标注这个注解;指明当前类是一个配置类;就是来替代之前的Spring配置文件
配置类 ----- 配置文件;配置类也是容器中的一个组件;@Component
编写一个配置类(@Configuration),是WebMvcConfigurerAdapter类型;不能标注@EnableWebMvc;
所有的SpringMVC的自动配置都失效了@EnableWebMvc
原理:@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;
导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能;
@Component//添加到容器
@ConfigurationProperties(prefix ="person")//配置文件为pojo实体类赋值
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix ="person":配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*/
//实体类中多用
@Validated //开启验证 @Email 验证邮箱格式
@PropertySource(value = {"classpath:person.properties"})
@Autowired 自动装配
//指定这是一个操作数据库的mapper
@Mapper
//使用MapperScan批量扫描所有的Mapper接口;
@MapperScan(value ="com.atguigu.springboot.mapper")
@Repository Dao接口
配置文件版:
mybatis:
config‐location: classpath:mybatis/mybatis‐config.xml 指定全局配置文件的位置
mapper‐locations: classpath:mybatis/mapper/*.xml 指定sql映射文件的位置
了解的注解
@Import(AutoConfigurationPackages.Registrar.class):
Spring的底层注解@Import,给容器中导入一个组件;导入的组件由
AutoConfigurationPackages.Registrar.class;
@EnableAutoConfiguration:开启自动配置功能;
@AutoConfigurationPackage:自动配置包
@PropertySource:加载指定的配置文件;
xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置;
日志
SpringBoot选用 SLF4j和logback;
//记录器
Logger logger = LoggerFactory.getLogger(getClass());
//日志的级别;
//由低到高 trace<debug<info<warn<error
# 可以指定完整的路径;
#logging.file=G:/springboot.log
# 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹;使用 spring.log 作为默认文件
logging.path=/spring/log
快速创建项目
IDEA:使用 Spring Initializer快速创建项目
- 导入web依赖
- 编写第一个程序
<!--导入web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
@RestController
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/one")
public String hello(){
return "hello Word";
}
}
#修改端口号
server.port=600
原理
结论:
- SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
- 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
- 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
- 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
- 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;
配置文件
properties配置文件在idea中默认utf-8可能会乱码
<!‐‐导入配置文件处理器,配置文件进行绑定就会有提示‐‐>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐configuration‐processor</artifactId>
<optional>true</optional>
</dependency>
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的
-
application.properties
-
- 语法结构 :key=value
-
application.yml
-
- 语法结构 :key:空格 value
- k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
**配置文件的作用 :**修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;
对象的属性和值得关系
student:
name: LONG
age: 18
行内写法
student: {name: qinjiang,age: 3}
数组( List、set )
用 - 值表示数组中的一个元素
pets:
- cat
- dog
- pig
行内写法
pets: [cat,dog,pig]
说明:语法要求严格!
1、空格不能省略
2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
3、属性和值的大小写都是十分敏感的。
yaml文件更强大的地方在于可以给我们的实体类直接注入匹配值!
@Component
实体类加载到spring中
@ConfigurationProperties作用:
//将配置文件中配置的每一个属性的值,映射到这个组件中;
//告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
//参数 prefix = “person”: 将配置文件中的person下面的所有属性一一对应
@Component //注册bean
person:
name: LONG
age: 18
happy: false
birth: 2000/01/01
maps: {k1: v1,k2: v2}
dog:
name: 哈巴
JSR303校验
@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;
空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) string is between min and max included.
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@ConfigurationProperties(prefix = "person")
@Validated//数据校验
public class Person {
@NotNull
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> map;
private Dog dog;
@Email
private String email;
}
1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟着的字母默认是大写的。这就是松散绑定。可以测试一下
3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法性
4、复杂类型封装,yml中可以封装对象 , 使用value就不支持
多环境配置
server:
port: 8081
#选择要激活那个环境块
spring:
profiles:
active: prod
---
server:
port: 8083
spring:
profiles: dev #配置环境的名称
---
server:
port: 8084
spring:
profiles: prod #配置环境的名称
注意:如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的!
优先级1:项目路径下的config文件夹配置文件
优先级2:项目路径下配置文件
优先级3:资源路径下的config文件夹配置文件
优先级4:资源路径下配置文件
静态资源
四个目录存放的静态资源可以被我们识别
"classpath:/META-INF/resources/"
"classpath:/resources/"
"classpath:/static/"
"classpath:/public/"
自定义静态资源路径
spring.resources.static-locations=classpath:/coding/,classpath:/Long/
Thymeleaf模板引擎
导入依赖
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
//templates目录下的所有页面,只能通过Controller来跳转!
//这个需要模板引擎的支持
@Controller
public class IndexController {
@RequestMapping("/test")
public String index(){return "index";}
}
跳转原理:视图解析器
不能再测试下建类,失效!
//templates目录下的所有页面,只能通过Controller来跳转!
//这个需要模板引擎的支持
@Controller
public class IndexController {
@RequestMapping("/t1")
public String test1(Model model){
model.addAttribute("msg","HELLO Springboot!");
//classpath:/templates/test.html
return "test";
}
@RequestMapping("/t2")
public String test2(Map<String,Object> map){
//存入数据
map.put("msg","<h1>Hello</h1>");
map.put("users", Arrays.asList("姓名","Long"));
//classpath:/templates/test.html
return "test";
}
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>是福网</title>
</head>
<body>
<h1>测试页面</h1>
<div th:text="${msg}"></div>
<!--不转义-->
<div th:utext="${msg}"></div>
<!--遍历数据-->
<!--th:each每次遍历都会生成当前这个标签:-->
<h4 th:each="user :${users}" th:text="${user}"></h4>
<h4>
<!--行内写法-->
<span th:each="user:${users}">[[${user}]]</span>
</h4>
</body>
</html>
//classpath:/templates/test.html
return “test”;
}
}
```html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>是福网</title>
</head>
<body>
<h1>测试页面</h1>
<div th:text="${msg}"></div>
<!--不转义-->
<div th:utext="${msg}"></div>
<!--遍历数据-->
<!--th:each每次遍历都会生成当前这个标签:-->
<h4 th:each="user :${users}" th:text="${user}"></h4>
<h4>
<!--行内写法-->
<span th:each="user:${users}">[[${user}]]</span>
</h4>
</body>
</html>