springboot学习
一、基础入门
1.1、快速入门
(1)第一步:创建一个maven工程"不需要创建web工程"
(2)第二步:导坐标
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
"导入这两个坐标后,会自动将导进去很多需要用的jar包"
(3)第三步:写一个启动类
"注意:一个项目需要一个启动类必须要与其他要
扫描的包在同一级别上。因为spring-boot会自动加载启动类
所在包下及其子包下的所有组件."
因为spring-boot会自动加载启动类所在包下及其子包下的所有组件.
@SpringBootApplication"该注解就是用来标注该类是启动类"
public class Application {
public static void main(String[] args) {
"//注意这个里面的参数:一个是当前类类型,一个是主函数的args"
SpringApplication.run(Application.class,args);
}
}
(4)第四步:写一个controller类
@RestController // @Controller + @ResponseBody
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/word")
public String sayHi() {
return "hello word";
}
}
"@RestController注解解释:该注解相当于@Controller
+ @ResponseBody,如果将@ResponseBody注解写在类上,
相当于给该类里面的每一个方法都加上了该注解。因此方法在
返回字符串时不是进行页面跳转, 而是将返回的字符串在页面
打印输出。(在spring MVC里面学过)"
(5)第五步:开始运行
首先,先运行启动类。等待启动类运行成功后,再在浏览器
里面输入相应的映射地址,
比如该例:"localhost:80808/hello/word"
1.2、运行时遇到一个小问题
- 出现Whitelabel Error Page问题
- 原因:没有将启动类与要扫描的类放到同一级别上。
- 解决方案:在上述第三步里面有详细说明。
1.3、生成jar包,并在cmd中运行jar包(项目部署)
1.3、依赖管理
- 父项目做依赖管理
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
</parent>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.5.RELEASE</version>
</parent>
- 开发导入starter场景启动器
(1)springboot提供了不同业务环境的启动器。"具体可以去官方文档查看"
(2)可以自定义启动器"具体请看官方文档"
- 无需关注版本号,自动版本仲裁
- 可以修改版本号
如果springboot底层引入的版本和你当前使用的不一致,则可以通过在pox文件里更改。
例如数据版本不同:如下所示
<properties>
修改版本号:注意这个标签名称,需要和底层依赖保持一致
<mysql.version>8.0.22</mysql.version>
</properties>
1.4、自动配置
- 自动配置tomcat
- 自动配好springMVC
(1)引入了springMVC的全套组件
(2)自动配置好sprigMVC常用组件
- 自动配好web常见功能:如:字符编码
springboot帮我们配置好了所有web常见开发场景
- 默认的包结构
(1)主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来。
(2)想要改变包扫描路径,只需在主程序的@SpringBootApplication(scanBasePackages="")里面设置就行。
- 各种配置的默认值
(1)默认配置最终都是映射到MultipartProperties.
(2)配置文件的值最终都会绑定到每个类上,这个类会在容器中创建对象
- 按需加载所有自动配置项
- …
二、底层注解
2.1、@Configuration注解
- 作用位置:类上
- 作用:告诉springBoot,该类是一个配置类,就相当于该类是一个配置文件。
- 该注解有一个属性:proxyBeanMethod,默认值是true。
为true时:简单理解,就是说该类的代理对象在执行下面方法时,
首先判断容器里面是否存在该组件(该方法的返回值对象),如果不存在则创建,
如果存在则直接返回。
为false时:简单理解,就是说在代理对象执行下面方法时,不会判断容器里是否存在该组件,
下面的的方法每一次执行都会产生一个新的对象。
2.1.1、给容器里注入组件的其他方式
- 除了使用@Bean注解之外,话可以使用以下注解。
- @Component、@Controller、@Service、@Repository
- @Import
2.2、@Import注解
- 作用位置:类上
- 用于导入一个组件,可以写在容器中任意一个组件上。
- 里面有一个数组类型的属性,只需将要组件的的类类型写进去就行。可以导入自己写的组件,也可以导入jar包的。
2.3、@Conditional注解(条件配置)
- 作用位置:方法、类
- 作用:一般使用的是该注解的派生注解,所以需要看其派生注解的具体作用
"如果标注在类上,则该类里面所有的方法都起作用"该注解的所有派生注解都是这样。
(1)@ConditionalOnBean("bean名称"):当容器里有该bean时,被该注解标注的方法才会执行。
(2)@ConditionalOnBean("bean名称"):当容器里面没有该bean时,方法才会执行。
2.4、@ImportResource()注解
- 作用位置:类上
- 作用:如果我们有一个 xml 配置文件,需要将里面的组件注册进来,就需要使用 @ImportResource 注解。
三、最佳实践
3.1、lombok简化开发
配置步骤
- 第一步:导入坐标
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
- 第二步:安装插件
在插件中搜索lombok,安装即可。 - 第三步:重启idea
- 第四步:配置
"通过添加这些注解,从而少写这些方法,让代码看起来更加简介"
@Data//get/set
@AllArgsConstructor//全参构造器
@NoArgsConstructor//无参构造器
@ToString//toString
@EqualsAndHashCode//hash和equals方法
@Slf4j//配置日志
@Component
@ConfigurationProperties(prefix="mycar")
public class Car {
private String name;
private double money;
}
3.2、devtools-自动重启项目
配置步骤
- 第一步:导入坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
- 第二步:当代码发生改变或者静态页面发生改变后不想通过重启按钮来启动。那就按下Ctrl+F9,进行重启。我的电脑好像不起作用,回头得找一下原因。
3.3、使用初始化向导创建项目-Springinitailizr
四、配置文件
4.1、使用properties配置文件
- 就是之前学习的properties文件,这里就不在多做解释。
4.2、yaml
- yaml基本语法
(1)key: value;kv之间要有空格;
(2)大小写敏感
(3)使用缩进表示层级关系;
(4)缩进不允许使用table,只允许空格,"但是idea好像可以允许,但是最好使用空格"
(5)缩进空格数不重要,只要相同层的元素左对齐就行。
(6)#代表注释。
(7)单引号/双引号表示的字符串内容会被转义/不专义;
- 数据类型
(1)字面量:单个的、不可再分的值。eg:达特、boolean、string、number、null...
K: v
(2)对象:键值对集合。map、hash、set、object、
行内写法:k: {k1:v1,k2:v2,k3:v3}
k:
k1: v1
k2: v2
k3: v3
(3)数组:array、list、queue
行内写法:k: [v1,v2,v3]
k:
- v1
- v2
- v3
例子:
@Date
@ToString
@Component
@ConfigurationProperties(prefix="person")
public classs Person{
private String username;
private Boolean boss;
private Date date;
private Integer age;
private Pet pet;
private String[] interests;
private List<String> animal;
private Map<String,Object> score;
private Set<Double> salarys;
private Map<String, List<Pet>> allPets;
}
person:
username: zhangsan
boss: true
date: 2012/2/12
age: 12
pet:
name: 阿花
age: 21
interests:
- zhangsan
- lisi
- wangwu
animal: [阿狗,阿猫,阿奇]
score:
english: 120
math: 150
salarys:
- 88.9
- 99.8
- 75.1
allPets:
health:
- name: 阿狗
age: 23
- name: 阿奇
age: 67
unhealth:
- {name: 阿彪,age: 21}
- {name: 阿狗,age: 12}
五、spring-boot-web开发
5.1、静态资源访问
5.1.1、静态资源目录
-
只要当静态资源放在类路径下:static、public、resources、META-INF/resources。通过静态资源名称就可以进行访问。
-
原理:静态映射/**。请求进来,先去找Controller看能不能处理,不能处理的请求就交给静态资源处理,如果静态资源也找不到则就报404。
5.1.2、静态资源访问前缀
- 默认是无前缀。
- 如果需要加前缀,首先要在yaml文件里配置前缀。例如下面所示,就配置上了一个res前缀。
spring:
mvc:
static-path-pattern: /res/**
再次访问静态资源时就需要加上前缀。