什么是spring boot:
简化spring应用开发的一个框架;
整个spring技术栈的一个大集合;
j2ee开发的集合栈。
优点:
什么是微服务:
微服务是一种架构风格,强调一个应用也应该是一组小型服务的集合,可以通过http的方式进行互通
功能:
浏览器发送hello请求,服务器接受请求并处理,响应HelloWorld字符串。
步骤:
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>1.5.9.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
package com.bread;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/*添加注解告诉springboot这是一个springboot应用,来标注一个主程序类*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
/*启动spring应用*/
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
package com.bread.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/*标记controller*/
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "Hello World!";
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WaWA2kTk-1600929776961)(C:\Users\悲伤的面包\AppData\Roaming\Typora\typora-user-images\image-20200804143322186.png)]
成功显示!
不用再像springmvc一样配置视图解析器、扫描包等
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>1.5.9.RELEASEversion>
parent>
springBoot的版本管理中心,依赖于另一个parent元素,定义了许多maven坐标的版本,使得我们不用手动定义依赖的版本
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
spring-boot-starter:springboot场景启动器
springboot将所有常用的功能场景都抽取了出来做成了一个个独立的启动器(starter),只需要在项目里引入starter,相关的所有依赖就会随之被导入。
/*添加注解告诉springboot这是一个springboot应用,来标注一个主程序类*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
/*启动spring应用*/
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
@SpringBootApplication注解用来标注springboot应用的主配置类,springboot应该运行这个类的main方法开启应用。
@SpringBootApplication类中又包含了几个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {
@Filter(
type = FilterType.CUSTOM,
classes = {
TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {
AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
**@SpringBootConfiguration:**标注在类上,表示这是一个springboot的配置类(替代配置文件)。效果跟@Configuration相同,不过前者由springboot定义,后者由spring定义。
@EnableAutoConfiguration:开启自动配置功能。
在EnableAutoConfiguration类中:
@AutoConfigurationPackage
@Import({
EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:自动配置包
在AutoConfigurationPackage类中:
@Import({Registrar.class})
@import为spring的底层注解,用于给容器中导入一个组件。
Registrar类:
@Order(-2147483648)
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar() {
}
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
}
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new AutoConfigurationPackages.PackageImport(metadata));
}
}
作用是将主配置类所在包及下面的所有子包里面的所有组件扫描到spring容器中
J2EE的整体自动配置都在autoconfig包下
new project — spring initializr — 填写信息 — 选择starters — 完成
resources目录结构:
static:存储静态资源
templates:保存所有的模板页面
application.properties:全局配置文件,用于修改默认配置
springboot会使用两种全局配置文件:
application.properties
application.yml
配置文件作用:修改springboot自动配置的默认值
yml是YAML语言文件,以数据为中心,比json、xml更适合做配置文件
基本语法:
k: y:表示一对键值对,key和value之间有空格,用缩进来表示层级关系
server:
port: 8081
path: /hello
输入字面量时(数字、字符串、布尔值、日期):
默认不使用引号
有转义字符参与时有两种情况:
name: ‘zhangsan \n lisi’ — zhangsan 换行 lisi
name: “zhangsan \n lisi” — zhangsan \n lisi
用双引号时,其中的特殊字符不会被转义输出
表示一个对象时:
分行写法
friends:
lastName: zhangsan
age: 20
行内写法
friends: {
lastName: zhangsan,age: 20}
输入数组时:
用- 值来表示数组中的一个元素
分行写法
pets:
- cat
- dog
行内写法
pets: [cat,dog,pig]
输入map时:
maps:
qq: 123
wechat: 456
maps: {
k1: v1,k2: v2}
在pom.xml中添加支持:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
实体类:
/*
* @ConfigurationProperties将本类中的属性与配置文件中的相关属性进行绑定
* prefix = "person" 指定绑定的是配置文件中的哪些属性
* */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Map<String,Integer> counts;
getter...
setter...
...
}
配置文件:
person:
name: zhangsan
age: 23
counts:
qq: 123
wechat: 456
Spring自带测试类:
@SpringBootTest
class Springboot01HelloworldQuickApplicationTests {
@Autowired
Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
输出:
Person{name='zhangsan', age=23, counts={qq=123, wechat=456}}
如果只是需要获取配置文件中的某个值,使用@Value
如果专门编写了一个javaBean来与配置文件进行映射,使用@ConfigurationProperties
**@ImportResource:**导入spring配置文件
标注在配置类上
@ImportResource(locations = {
"classpath:beans.xml"})
但springboot推荐用编写配置类的方式:
详细介绍看"Spring注解驱动开发"笔记“配置类替代配置文件”部分
随机数:${random.int}
获取配置文件中其他属性:${person.name}
${person.name:xiaoming}(默认值为xiaoming)
profile是spring对不同环境提供不同配置功能的支持(开发时用开发环境,测试时用测试环境等等),可以通过激活、指定参数等方式快速切换环境。
创建不同环境下对应的profile配置文件(使用properties类型配置文件时):
格式:application-{profile}.properties
application-dev.properties
application-prod.properties
激活配置文件:
在配置文件中指定spring.profiles.active={profile}
虚拟机参数激活:idea中在右上角run窗口中点击edit,修改VM options,添加
-Dspring.profiles.active={profile}
命令行激活:运行打好的jar包时在最后添加(空格)–spring.profiles.active={profile}或在run窗口中的Program Argument参数中添加
优先级:命令行>虚拟机>配置文件
yml文档块格式:
以yml作为配置文件时操作更为简单,我们可以使用多文档块格式
server:
port: 8082
spring:
profiles:
active:
dev
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
配置文件优先级:
优先级由高到低,高优先级的配置会覆盖低优先级的配置,达到互补配置的效果
指定配置文件:
使用命令行运行jar包时,在最后加上
(空格)–spring.config.Location=D:/applition.properties
@Conditional派生注解
作用:符合注解标注的条件后才给容器中添加组件,配置类中的内容才会生效
@Conditional派生注解 | 作用(判断是否满足当前指定条件) |
---|---|
@ConditionalOnJava | 系统的java版本是否符合要求 |
@ConditionalOnBean | 容器中存在指定bean |
@ConditionalOnMissingBean | 容器中不存在指定bean |
检查自动配置生效情况
在配置文件中添加:
debug=true
进入springboot debug模式,在控制台打印的Auto-Configuration report部分查看自动配置生效情况