优点
1.快速构建项目:省略了繁琐且重复的 xml 配置,分分钟构建一个 web 工程;
2.对主流开发框架的无配置集成:提供了很多 Starter 依赖包,开箱即用,无需多余配置;
3.项目可独立运行:无需外部依赖 Servlet 容器;
4.极大地提供了开发、部署效率;
5.监控简单:提供了 actuator 包,可以使用它来对你的应用进行监控。
缺点
1.依赖太多:一个简单的 SpringBoot 应用都有好几十 M 只有;
2.缺少监控集成方案、安全管理方案:只提供基础监控,要实现生产级别的监控,监控方案需 要自己动手解决
语法SpringBoot配置文件
配置文件的作用:修改Spring Boot自动配置的默认值
Spring Boot使用一个全局的配置文件,配置文件名是固定的
application.properties
application.yml
配置文件一般放在src/main/resources目录或者类路径/config下
YAML
标记语言:
YAML:以数据为中心,比json、xml更适合做配置文件
1.基本语法
k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级
例如:
server:
port: 8081
path: /hello
注意 : 属性和值也是大小写敏感
2.值的写法:
字面量:普通的值(数字,字符串,布尔)
k: v:字面值直接来写
字符串默认不用加单引号或者双引号
“双引号;不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思
name:"zhangsan \n lisi"输出后zhangsan 换行 lisi
单引号:会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name:"zhangsan \n lisi"输出后zhangsan \n lisi 不会改变
对象、Map(属性和值)(键值对);
对象的写法
k: v:
对象还是k: v的方式
例如:
friends:
name: zhangsan
age: 12
或者:friends: {name: zhangsna,age: 15}
数组(List、Set)
用 -值 表示数组中的一个元素
pets:
-cat
-dog
行内写法
pets: [cat,dog]
person:
lastname: zhangsan
age: 18
boss: false
birth: 2021/12/5
maps: {k1: v1,k2: v2}
lists:
- lisi
- zhang
dog:
name: xiaoqi
age: 12
我们在生成springboot项目时可以使用Spring Initializr来自动创建springboot项目的目录
它会在官网上自动下载
使用Spring Initializer快速创建Spring Boot项目
默认生成的Spring Boot 项目
主程序已经生成好了,我们只需选择自己的逻辑
resources文件夹中目录结构:
static:保存所有的静态资源;js css images
templates:保存了所有的模板页面;(SpringBoot 默认jar包使用嵌入式的tomcat,默认不支持jsp页面)
可以使用模板引擎
Application.properties:Spring Boot应用的配置文件;可以修改一些默认设置
我们在做springboot项目的过程中会使用到Maven
Maven基本命令
-v:查询Maven版本
本命令用于检查maven是否安装成功。
Maven安装完成之后,在命令行输入mvn -v,若出现maven信息,则说明安装成功。
compile:编译
将java源文件编译成class文件
test:测试项目
执行test目录下的测试用例
package:打包
将项目打成jar包
clean:删除target文件夹
install:安装
读取配置文件的内容
@ConfigurationProperties(prefix = "person")将配置文件中配置的每一个属性值,映射到这个组件中
/**
* 将配置文件中配置的每一个属性值,映射到这个组件中
*@ConfigurationProperties告诉springboot将本类中所有的属性和配置文件中的相关配置进行绑定;
* prefix="person",配置文件中person下面的所有属性进行一一映射
* 只有组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
* @ConfigurationProterties(prefix = "person")默认从全局文件中获取值
*
*@PropertySource(value = {"classpath:person.properties"})加载指定的配置文件
*
*@ImportResource导入spring的配置文件
* springboot中没有spring的配置文件,我们自己编写的配置文件,也不能自动识别;
* 想让spring配置文件生效,就要用@@ImportResource标注在一个配置类上,让其生效
*/
@Component
//加载指定的配置文件
@PropertySource(value = {"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastname;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
SpringBoot常用注解
@SpringBootApplication:是Sprnig Boot项目的核心注解,目的是开启自动配置
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Configuration:指明当前类是配置类,就是用来替代之前的spring配置文件,等同于spring的XML配置文件
/**
* @Configuration:指明当前类时配置类,就是来替代之前的spring配置文件
* 以前在配置文件中我们使用<bean></bean>标签添加组件
*
*/
@Configuration
public class Myconfig {
@Bean
//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
public HelloService helloService() {
System.out.println("配置类@Bean给容器中添加组件了");
return new HelloService();
}
}
@Autowired:自动导入依赖的bean和@Bean:用@Bean标注方法等价于XML中配置的bean。
@Configuration
public class UserConfigTest extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(password());
}
@Bean
PasswordEncoder password(){
return new BCryptPasswordEncoder();
}
用.properties文件配置实体类的值
#配置person的值
person.lastname=xia
person.age=0
person.boss=false
person.birth=2017/5/26
person.maps.k1=20
person.maps.k2=30
person.lists=a,b,c
person..dog.name=小七
person.dog.age=2
pom.xml文件配置:
<!-- 导入配置文件处理器,配置文件绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<!-- 打包 这个插件可以将应用打包成一个可执行的jar包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置文件占位符
随机数
person.lastname=张靓颖${random.uuid}
#person.age=0
person.age=${random.int}
person.boss=false
person.birth=2017/5/26
person.maps.k1=20
person.maps.k2=30
person.lists=a,b,c
person..dog.name=${person.hello:hello}dog
person.dog.age=2
执行结果
Person{lastname='张靓颖464de6c2-40df-4d2b-9f89-0f3b048ece7a', age=426671851, boss=false, birth=Fri May 26 00:00:00 CST 2017, maps={k1=20, k2=30}, lists=[a, b, c], dog=Dog{name='hellodog', age=2}}
占位符获取之前匹配的值,如果没有可以用冒号:指定默认值