相信好多小伙伴都是从ssm的年代走过来,繁琐的配置,写不完的xml配置文件,历历在目。直到它的出现,哇,美妙-SpringBoot。主打入门❤️
Get start
- 创建个Maven工程:pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
- 主程序
@SpringBootApplication
public class HelloWord01 {
public static void main(String[] args) {
SpringApplication.run(HelloWord01.class,args);
}
}
- 这时一个简单的SpringBoot程序就完成了。。。
- 那么如何打包部署呢,这个和以往的就不同了,不是打成war包,而是jar包,需要在pom.xml中添加:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- 编译成可执行文件,然后通过 java -jar 项目名 这样的命令进行执行
spring-boot-starter 介绍
- 是
spring-boot场景启动器,帮我们导入所依赖的组件 spring-boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里边引入这些starter,那么所有的依赖就都会导进来。要用什么功能,就导入什么功能的启动器。- 其中所有的依赖都在
parent项目中仲裁好了,如果我们要调整一些依赖,比如我的mysql版本是5.7 需要5.X的驱动包,可以直接在pom中添加:(这其实是maven的特性)
<properties>
<mysql.version>5.1.20</mysql.version>
</properties>
@SpringBootApplication
SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;下面是@SpringBootApplication注解内容:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication
@SpringBootConfiguration
SpringBoot的配置类,标注在某个类上,表示这是一个Spring Boot的配置类;他的注解信息其实就是一个配置类
@Configuration
- 配置类上来标注这个注解
- 配置类 ----- 配置文件;配置类也是容器中的一个组件;类似
@Component
@EnableAutoConfiguration
- 开启自动配置功能;以前我们需要配置的东西,
SpringBoot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能;这样自动配置才能生效 - 其中的
@AutoConfigurationPackage注解中用import的方式导入了一些组件,看源码发现是将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器 @Import(EnableAutoConfigurationImportSelector.class)注解的内容是:给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件
Spring-Boot的配置
- SpringBoot使用一个全局的配置文件,配置文件名是固定的;
- application.properties
- application.yml
yml的语法格式
- k:(空格)v:表示一对键值对(空格必须有)
- 以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
- 属性和值也是大小写敏感
- 值的写法
- 字面量:普通的值(数字,字符串,布尔)
- k: v:字面直接来写
- 字符串默认不用加上单引号或者双引号
- "":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
- name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
- '':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
- name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
- 对象、Map(属性和值)(键值对):
- k: v:在下一行来写对象的属性和值的关系;注意缩进
- 对象还是k: v的方式
- 字面量:普通的值(数字,字符串,布尔)
riends:
lastName: zhangsan
age: 20
#行内写法:
friends: {lastName: zhangsan,age: 18}
- 数组(List、Set):
- 用- 值表示数组中的一个元素:
pets:
‐ cat
‐ dog
‐ pig
#行内写法: pets: [cat,dog,pig]
配置文件值注入
@ConfigurationProperties
- 通过
@ConfigurationProperties注解,告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;prefix = "student":配置文件中哪个下面的所有属性进行一一映射。只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能,所以需加上@Component。
@Component
@ConfigurationProperties(prefix = "student")
public class Student {
private String lastName;
private Integer age;
private Boolean bos;
private Date birth;
orivate MapcString,Object> maps;
private List<Object> lists;
private Dog dog;
}
@Value获取值和@ConfigurationProperties获取值比较:
| @ConfigurationProperties | oValue | |
|---|---|---|
| 功能 | 批量注入配置文件中的属性 | 一个个指定 |
| 松散绑定( 松散语法 ) | 支持 | 不支持 |
| SpEL | 不支持 | 支持 |
| SR303数据校验 | 支持 | 不支持 |
| 复杂类型封装 | 支持 | 不支持 |
- 如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用
@Value - 如果说,我们专门编写了一个
javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties - 这个
@ConfigurationProperties注解默认加载的是全局配置文件-application.yml这个文件里的内容,但是这样不太好。因为这个全局的配置文件是配置springboot 的一些信息的 - 如果是我们自己的变量 好一点的办法是新写一个自己的配置文件:
xxx.properties,指定自定义的配置文件使用@PropertySource注解。(只能用于properties文件)
@ImportResource
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效- Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
- 想让Spring的配置文件生效,加载进来;
@ImportResource标注在一个配置类上(就是标注在@Configuration注解上):
@ImportResource(locations = ("classpath:student.xml"})
@SpringBootApplication
public class SpringBooApplication {}