文章目录
- 1. Spring Initializr 部署框架
- 1.1 选择Spring Initializr
- 1.2 选择版本并创建模板
- 1.3 测试并启动
- 2. 全局配置
- 2.1 yml文件
- 2.2 逐个读取配置文件数据
- 2.3 读取全部配置文件
- 2.4 将配置文件信息写入对象
- 2.4.1 松散绑定
- 2.4.2 注明单位
- 2.4.3 数据校验
- 3. 常用注解
- 3.1 新建实例类
- 3.2 新建配置类
- 3.3 测试
1. Spring Initializr 部署框架
1.1 选择Spring Initializr
注意,如果上述 Server URL
的地址为官网 start.spring.io
时速度很慢,可以选择将其更换为 start.aliyun.com
。
1.2 选择版本并创建模板
1.3 测试并启动
创建一个 controller
包来编写控制器,控制器类文件 HelloController.java
中的内容如下:
@RestController
public class HelloController {
@RequestMapping("/hello2")
public String hello(String name){
return "hello springboot2!!!";
}
}
注意,创建的 controller
包应该与启动类文件同级,否则 springboot
扫描不到相应的文件。
SpringBoot中内置有 Tomcat,所以不必另外配置 Tomcat服务,直接访问网址 http://localhost:8080/hello2
就能看到打印出的 hello springboot2!!!
。
@RestController
注解相当于 @controller
和 @ResponseBody
的结合.@Controller
将当前修饰的类注入SpringBoot Ioc容器,使得从该类所在的项目跑起来的过程中,这个类就被实例化。@ResponseBody
它的作用简短截说就是指该类中所有的API接口返回的数据,甭管你对应的方法返回Map或是其他Object,它会以Json字符串的形式返回给客户端。
2. 全局配置
SpringBoot中有一个引导类,即初始化的文件,其中的引导类的作用是
- 初始化SpringBoot容器,扫描引导类所在的包能够加载Bean
- 引导类是工程的入口,运行main方法就能启动项目
使用骨架创建了SpringBoot项目后,在 resource
目录下就有一个名为 application.properties
的配置文件,该配置文件可以加载SpringBoot的一些配置信息。
2.1 yml文件
默认得到的配置文件是 properties
文件,但是推荐使用 yml
文件,即将文件名改为 application.yml
。
- 语言格式
yml语言每一级采用两个空格来区分,注意,冒号后面有一个空格,如下:
server:
port: 82
表示server下的port设置为82端口。
- 字面量
key: value
:字⾯直接来写;""
:双引号;会转义字符串⾥⾯的特殊字符;特殊字符会作为本身想表示的意思;''
:单引号;不会转义特殊字符,特殊字符最终只是⼀个普通的字符串数据。
如"1 \n 2"
与‘1 \n 2’
表达式不同的,前者会被转义为换行符,后者原样输出。 - 对象
key: value:在下⼀⾏来写对象的属性和值的关系,需要进⾏缩进,如下:
friends:
lastName: zhangsan
age: 20
⾏内写法:
friends: {lastName: zhangsan,age: 18}
- 数组
使⽤-
值表示数组中的⼀个元素,如下:
pets:
- cat
- dog
- pig
数组⾏内写法:
pets: [cat,dog,pig]
- 引用
当需要引用前面定义的变量时,跟下面的读取文件一样,使用${}
即可,如下:
server:
port: 82
s: 端口是${server.port}
- 数字
yaml支持二进制,十进制、八进制、十六进制的表示,所以,当你要输入数字的时候 就要小心了,比如,你将密码设置如下
password: 0127
即是你使用的是字符串来存储数据,你读出的时候也是 "87"
这个值,为什么呢?因为以 0
开头的数据是默认为八进制的,所以读取的时候按照的是八进制来读取,这个时候如果不希望读到八进制,就需要加个双引号,如下:
password: "0127"
2.2 逐个读取配置文件数据
2.3 读取全部配置文件
读取单⼀数据可以解决读取数据的问题,但是如果定义的数据量过⼤,这么⼀个⼀个书写肯定会累死⼈的,SpringBoot提供了⼀个对象,能够把所有的数据都封装到这⼀个对象中,这个对象叫做Environment,使⽤⾃动装配注解可以将所有的yaml数据封装到这个对象中。
配置文件中的内容如下所示:
person:
name: zhangsan
age: 20
#数组
hobbies:
- basketball
- volleyball
控制器中的内容如下所示:
@RestController
public class HelloController {
@Autowired
private Environment environment;
@RequestMapping("/hello2")
public String hello(){
System.out.println(environment.getProperty("person.name"));
System.out.println(environment.getProperty("hobbies[0]"));
return "hello Spring Boot";
}
}
采用这种方法也能获得配置文件中的数据。
2.4 将配置文件信息写入对象
比如在 application.yml
文件中有以下的数据:
person:
name: marui
age: 18
那么可以使用注解 @ConfigurationProperties()
来将其装填到实体类中去,装填时需要指定一个参数 prefix
,这个参数表明引用的配置文件数据的前缀名,如下所示:
@Component
@ConfigurationProperties(prefix = "person")
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Person {
private String name;
private int age;
}
2.4.1 松散绑定
@ConfigurationProperties(prefix = "person")
中 prefix
的参数只能使用小写字母、数字、下划线的形式,但是,对应的 yml
文件中的属性名是支持松散绑定的,例如 yml
中的 person.name
属性写为 Name,NAME,name,na-m-e,n_a-m_e
都是可以读到相应的对象中去的,但注意,这仅在 @ConfigurationProperties
对应的 yml
文件配置中可以支持松散绑定,其他的如 @Value
等都不支持。
2.4.2 注明单位
给配置文件中的内容追加两个属性,一个是有效时间, 一个是占用大小,这两个属性如下:
person:
name: marui
age: 18
setTimeOut: 30
datasize: 5
现在就产生了一个很明显的问题,这两个属性的单位是什么,想要注明两个变量的单位,我们可以使用注解来对其单位进行解释。
@Component
@ConfigurationProperties(prefix = "person")
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Person {
private String name;
private int age;
@DurationUnit(ChronoUnit.MINUTES) //表示单位是分
private Duration setTimeOut;
@DataSizeUnit(DataUnit.MEGABYTES) //表示单位是MB
private DataSize datasize;
}
有时会莫名其妙报错,加个下面的依赖就行
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2.4.3 数据校验
安装下面的依赖进行数据校验
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
而且需要在校验的类前面加上类注解 @Validated
。
依然用上面的实例进行示范,比如给年龄增加最大值与最小值:
@Component
@ConfigurationProperties(prefix = "person")
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Validated
public class Person {
private String name;
@Max(value = 99, message = "最大年龄不能超过99")
@Min(value = 0, message = "最小年龄不能小于0")
private int age;
@DurationUnit(ChronoUnit.MINUTES) //表示单位是分
private Duration setTimeOut;
@DataSizeUnit(DataUnit.MEGABYTES) //表示单位是MB
private DataSize datasize;
}
若是读取的信息不符合条件,会进行报错,提示信息未自己所写的信息。
常用的校验信息如下:
校验注解 | 含义 |
| 被注释的元素必须为 null |
| 被注释的元素必须不为 null |
| 被注释的元素必须为 true |
| 被注释的元素必须为 false |
| 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
| 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
| 被注释的元素的大小必须在指定的范围内 |
| 被注释的元素必须是一个过去的日期 |
| 被注释的元素必须是一个将来的日期 |
| 被注释的元素必须符合指定的正则表达式 |
| 被注释的元素必须是电子邮箱地址 |
| 被注释的字符串的大小必须在指定的范围内 |
| 被注释的字符串的必须非空 |
3. 常用注解
-
@Configuration
:声明⼀个类作为配置类 -
@Bean
:声明在⽅法上,将⽅法的返回值加⼊Bean容器 -
@Value
:属性注⼊ -
@ConfigurationProperties(prefix = "jdbc")
:批量属性注⼊,在类前进行注解,prefix
参数表示其是配置文件的哪个对象。
为了展示以上注解的使用与功能,现进行如下操作。
3.1 新建实例类
首先导入 lombok
依赖。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
在 beans
包下新建一个 Book
类来进行实验。
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Book {
private String book_name;
private int book_id;
private String book_author;
}
再新建一个 Car
类来进行实验。
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Car {
private String car_name;
private int car_id;
private String car_owner;
}
3.2 新建配置类
新建一个配置类 Test1.java
,在里面写上内容如下:
@Configuration
public class Test1 {
@Bean(name = "book")
public Book book_bean(){
Book book = new Book("福尔摩斯", 11, "柯南道尔");
return book;
}
@Bean(name = "car")
public Car car_bean(){
Car car = new Car("宝马", 10086, "华生");
return car;
}
}
上述内容中的 @Configuration
就相当于是Spring中的xml配置文件,其中的每个 @Bean
注解就相当于是在 xml 配置文件中配置的一个 bean
。
3.3 测试
在 HelloController.java
文件中进行如下测试:
@RestController
public class HelloController {
@RequestMapping("/hello2")
public String hello(){
ApplicationContext context = new AnnotationConfigApplicationContext(Test1.class);
Car car = (Car)context.getBean("car");
Book book = (Book) context.getBean("book");
System.out.println(car);
System.out.println(book);
return "hello Spring Boot";
}
}
其能够将创建的实例输出,代表我们实验成功。