6 配置热部署
热启动会消耗系统性能,开启时慎重。
部署完成使用时快捷键:ctrl + f9 手动刷新,一般可以Ctrl+s就是自动刷新
我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,浪费了大 量的时间,我们可以在修改代码后不重启就能生效,在 pom.xml 中添加如下配置就可以实现这样的功能,我们称 之为热部署
<!--热部署配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
注意:IDEA进行SpringBoot热部署失败原因
出现这种情况,并不是热部署配置问题,其根本原因是因为Intellij IEDA默认情况下不会自动编译,需要对IDEA进 行自动编译的设置,如下
7 SpringBoot起步依赖原理分析
- 在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本。
- 在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程。
- 我们的工程继承parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突等问题。
8 application.yml配置文件
8.1 yml配置文件简介
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,
就可以使用 application.properties或者application.yml(application.yaml)进行配置。
SpringBoot默认会从Resources目录下加载application.properties或application.yml(application.yaml)文件。其中,application.properties文件是键值对类型的文件,之前一直在使用,所以此处不在对properties文件的格式 进行阐述。除了properties文件外,SpringBoot还可以使用yml文件进行配置,下面对yml文件进行讲解。
YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数 据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导 入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简 洁。
YML文件的扩展名可以使用.yml或者.yaml。
8.2 yml语法注意事项
- 大小写敏感
- 数据值前边必须有空格,作为分隔符
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱)。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- ‘’#” 表示注释,从这个字符一直到行尾,都会被解析器忽略。
8.3 yml配置文件的语法
8.3.1 配置普通数据(纯量)
语法: key: value 示例代码
name: haohao msg1: 'hello \n world' # 单引忽略转义字符 msg2: "hello \n world" # 双引识别转义字符
注意:value之前有一个空格
8.3.2 配置对象或者Map数据
语法:
key:
key1: value1
key2: value2
或者:
key: {key1: value1,key2: value2} 示例代码
person: name: haohao age: 31 addr: beijing #或者 person: {name: haohao,age: 31,addr: beijing}
注意:key1前面的空格个数不限定,在yml语法中,相同缩进代表同一个级别
8.3.3 配置数组、List、Set数据
语法:
key: - value1 - value2 # 或者: key: [value1,value2]
示例代码
coldluy: - beijing - tianjin - shanghai - chongqing # 或者 coldluy: [beijing,tianjin,shanghai,chongqing] # 集合中的元素是对象形式 student: - name: zhangsan age: 18 score: 100 - name: lisi age: 28 score: 88 - name: wangwu age: 38 score: 90
注意:value1与之间的 - 之间存在一个空格
8.3.4 参数引用
name: lisi person: name: ${name} # 引用上边定义的name值
8.4 获取yml文件中的数据
方式1:使用@Value
我们可以通过@Value注解将配置文件中的值映射到一个Spring管理的Bean的字段上
例如:
application.yml配置
person: name: zhangsan age: 18
java代码
@Controller public class QuickStartController { @Value("${person.name}") private String name; @Value("${person.age}") private Integer age; @RequestMapping("/quick") @ResponseBody public String quick(){ return "springboot 访问成功! name="+name+",age="+age; } }
方式2:使用Evironment
application.yml配置
person: name: tom age: 23
java代码
@RestController public class QuickController { @Autowired private Environment env; @GetMapping("/getPropInfo") public String getPropInfo(){ return "查询结果:"+env.getProperty("person.name"); } }
方式3:使用@ConfigurationProperties
通过注解@ConfigurationProperties(prefix=”配置文件中的key的前缀”)可以将配置文件中的配置自动与实体进行映 射
application.yml配置
person: name: zhangsan age: 18
java代码
@Controller @ConfigurationProperties(prefix = "person") public class QuickStartController { private String name; private Integer age; @RequestMapping("/quick") @ResponseBody public String quick(){ return "springboot 访问成功! name="+name+",age="+age; } public void setName(String name) { this.name = name; } public void setAge(Integer age) { this.age = age; } }
可以注入子类
注意:使用@ConfigurationProperties方式可以进行配置文件与实体字段的自动映射,但需要字段必须提供set方 法才可以,而使用@Value注解修饰的字段不需要提供set方法
9 约定优于配置怎么体现的
SpringBoot解决了配置文件和业务逻辑不停切换的问题
使用SrpingBoot就不需要配置文件了,直接使用JAVA文件+注解开发
使用注解(约定)作为配置文件
@Configuration public class MyFilterConfiguration { @Bean public FilterRegistrationBean myFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new MyFilter());//添加过滤器 registration.addUrlPatterns("/");//设置过滤路径,/所有路径 registration.addInoldluParameter("name", "alue");//添加默认参数 registration.setName("MyFilter");//设置优先级 registration.setOrder(1);//设置优先级 return registration; } }
使用xml(配置文件) 作为配置文件
- @Configuration和@Bean注解说明:
@Configuration 标注在类上,相当于把该类作为spring的xml配置文件中的 ,作用为:配置spring容器(应用上下文),上文中在MyFilterConfiguration类上添加了该注解,相当于创建了一个beans.xml配置文件里面的内容是
Xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd" default-lazy-inoldlu="false" > </beans>
- @Bean标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的,作用为:注册bean对象。
@Bean注解在返回实例的方法上,如果未通过@Bean指定bean的名称,则默认与标注的方法名相同。
@Bean注解默认作用域为单例singleton作用域,可通过@Scope(“prototype”)设置为原型作用域
上文中在myFilterRegistration()方法上加了@Bean注解,表示在spring启动的时候会执行该方法并将结果作为一个bean注册到容器中,该bean的名字是”myFilterRegistration”