目录
3.springboot自动装配读取的文件是哪个?原理是什么?
1.什么是SpringBoot?
本质是通过“约定大于配置”对spring进一步的封装。
2.如何快速创建一个SpringBoot的web项目?
在创建springboot项目时勾选“Spring Web”,即可快速创建springboot的web项目。
如果前期未在这里勾选,也可以在pom文件中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
然后新建一个类,输入如下代码:
@RestController
public class HelloWorld {
@GetMapping("/sayHello")
public String sayHello(){
return "你好,世界";
}
}
启动项目,我们能从启动日志上看到,我们的项目端口是8080,没有上下文路径,所以我们直接访问:http://localhost:8080/sayHello
能看到页面是直接返回,即成功。
这里我们看到默认启动端口是8080,怎么修改端口号呢,可以在application.properties里面修改端口号,添加
server.port=8088
即可修改项目的端口号,这就是“约定大于配置”的思想,不需要再写繁杂的xml配置文件,只要约定好在哪里需要写上什么就可以轻松修改。
3.springboot自动装配读取的文件是哪个?原理是什么?
自动装配读取的是META-INF包下的spring.factories文件里的内容,本质是结合是否存在类的注解,最后获取到类的全路径,然后再通过反射去创建对象。
4.yml的书写注意点以及配置优先级
配置文件可以写成yml或者yaml结尾得文件,使用的时候需要注意空格。如下是一个简单的例子:
如果项目中同时写了application.properties和application.yml,则application.properties中的同名属性会生效,也就是说application.properties的优先级更高。
5.springboot中的赋值操作
可以使用@ConfigurationProperties(prefix = "xxx")的注解实现,以下是一个自动赋值student对象的例子:
首先定义两个类,Dog和Student
@Data
public class Dog {
private String name;
private Integer age;
}
@Component
@ConfigurationProperties(prefix = "student")
@Data
public class Student {
private String name;
private Integer age;
private Map<String, Object> maps;
private List<Object> list;
private Dog dog;
}
在application.yml文件中编写好对应的值
student:
name: duolaimi
age: 20
maps: {k1: v1, k2: v2}
list:
- code
- music
dog:
name: 旺财
age: 3
最关键的是定义的类上加上了@ConfigurationProperties(prefix = "xxx")注解,并且prefix与yml定义的前面的值相同,如果都为student,即对应上了。
运行test文件,发现能自动赋值。
总结:需要配置多个值时,可以使用yml配置加上@ConfigurationProperties注解的方式,一次性赋值。
如果只是单个值赋值或者少量值赋值,则可以用@Value加上spel,如下所示
@Component
@Data
public class Dog {
@Value("${dogname}")
private String name;
@Value("${dogage}")
private Integer age;
}
这样也能正常赋值。
还能使用Environment接口,能将配置文件中的所有属性赋值到一个对象中,使用时加@Autowired,类似map,直接调用getProperty()方法传入要查的key即可。
6.JSR303的使用
什么是JSR303?简单来说,它是一个通过注解就能约束数据的工具
使用的话,只需在类上加上@Validated注解,然后在对应的属性上添加校验规则即可。比如:
@Component
@ConfigurationProperties(prefix = "student")
@Validated
@Data
public class Student {
@NotNull(message = "学生姓名不能为空")
private String name;
private Integer age;
private Map<String, Object> maps;
private List<Object> list;