1.springboot的热部署
1.1 作用: spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。
1.2 需要引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
修改java代码或者配置文件模版后可以通过ctrl+f9来实现热部署
2. 配置文件
2.1 springboot使用一个全局的配置文件,配置文件名是固定的(application.properties或者application.yml)
2.2 配置文件的作用:修改spring boot自动配置的默认值;springboot在底层都给我们自己配置好
2.3 和以前xml配置文件的区别:以前大多都使用的是xxx.xml文件
yml 以数据为中心,比json,xml等更适合做配置文件
3. yaml的语法
3.1 基本语法
k:(空格)v:表示一对键值对(注意空格是必须要有的)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
注意: 属性和值也是大小写敏感的
server: port: 8081 path: /hello
3.2 值的写法
字面量:普通的值(数字,字符串,布尔)
直接按照 k: v的形式写就可以
字符串默认不用加入单引号或者双引号[如果字符串不包含特殊字符(如冒号
:
、逗号,
、换行符等),则可以直接书写。]当加入双引号时不会转义字符例如"a\nb" 代表的是 a\nb
当加入单引号时会转义字符例如'a\nb' 代表的是a(回城)n
3.3 对象,Map(属性和值)(键值对):
k: v:在下一行来写对象的属性和值的关系,注意缩进!!!
对象还是k:v的方式
数组(List,Set):用-值表示数组中的一个元素
4. 配置文件值注入
4.1 配置文件
4.2 javaBean
4.3 @configurationProperties(prefix = "person")
4.3.1 作用:将配置文件中的配置的每一个属性的值,映射到这个组件中
4.3.2 @configurationProperties 是告诉springboot将本类中的所有属性和配置文件中相关的配置进行绑定;
4.3.3 prefic = "person":配置文件中哪个下面的所有属性进行一一映射
4.3.4 注意容易错的!!:只有当这个组件是容器中的组件,才能容器提供的 @configurationProperties功能,也就是说必须加上类似(@component,@commction,@service这种)
5. spring-boot-configuration-processor依赖的作用
5.1.1 作用:为了方便提供了一个生成配置的元数据信息的依赖
即当我们在javaBean中写了属性,在application.yml编辑的时候会提示如下图
<!‐‐导入配置文件处理器,配置文件进行绑定就会有提示‐‐> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring‐boot‐configuration‐processor</artifactId> <optional>true</optional> </dependency>
6.使用时可能遇到的问题
6.1 properties配置文件在idea中默认utf-8可能会乱码
解决:修改idea中的配置格式就好 (File—>Settings------>Editor------>File Encodings)
7.此外使用@value也可以进行获取值
1.例如:
1.1application.properties
文件内容:app.name=My Application app.version=1.0.0
1.2 使用
@Component public class MyComponent { @Value("${app.name}") private String appName; @Value("${app.version}") private String appVersion; // 其他类成员和方法 }
1.3 @Value和@ConfigurationProperties获取值比较
重点: 无论配置文件是yml还是proerties,他们都能获取到值
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,则使用
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
3. @value中的#和$的区别(还可以什么都不加直接复制)
3.1 #:其实是Spring Expression Language (SpEL)表达式,可以在注入属性前进行一些简单的计算等逻辑。
例如:
@Value注解的作用主要可以给属性直接赋值、也可以读取配置文件中的值给属性赋值。
例如:
8. @ImportResource的作用
8.1 作用: 导入spring的配置文件,让配置文件里面的内容生效
由于Springboot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别
想让spring的配置文件生效,加载进来;@I,portResource标注在一个配置类上
SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式
1、配置类@Configuration------>Spring配置文件
2、使用@Bean给容器中添加组件/** * @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件 * * 在配置文件中用<bean><bean/>标签添加组件 * * / @Configuration public class MyAppConfig { //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名 @Bean public HelloService helloService02(){ System.out.println("配置类@Bean给容器中添加组件了..."); return new HelloService(); } }
9. 配置文件占位符
9.1 随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}9.2 占位符获取之前配置的值,如果没有可以是用:指定默认值
person.last‐name=张三${random.uuid} person.age=${random.int} person.birth=2017/12/15 person.boss=false person.maps.k1=v1 person.maps.k2=14 person.lists=a,b,c person.dog.name=${person.hello:hello}_dog person.dog.age=15
10. Profile
10.1 多Profile文件
我们在主配置文件编写的时候,文件名可以是application.properties/yml
默认是使用applicatio.properties来进行配置的
10.2 yml支持多文档块方式
10.3 激活指定的profile
10.3.1 在application.properties中指定spring.profiles.active=dev(配置文件方式)
10.3.2 使用命令java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;可以直接在测试的时候,配置传入命令行参数(命令行方式)
10.3.3 虚拟机参数;-Dspring.profiles.active=dev
11. 配置文件加载位置
11.1 springboot启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
- file:./config/:当前目录的
config
子目录。- file:./:当前目录。
- classpath:/config/:类路径下的
config
包。- classpath:/:类路径的根目录。
优先级又高到低,高优先级的配置会覆盖低优先级的配置;SpringBoot会从这四个位置全部加载主配置文件;互补配置;
注意:优先级是指属性最后使用的值,而不是说仅仅扫描优先级高的路径,不是发现了 application.properties文件就停止。例如classpath:/config/和file:./config/都存在配置文 件 ,那么加载过程会加载classpath:/config/路径下配置文件的所有属性,然后再加载 file:./config/路径下配置文件的属性并替换已有的属性。此外,如果你在相同优先级位置 同时有application.properties和application.yml,那么application.yml里面的属性就会覆 盖application.properties里的属性。
12.自动配置原理
12.1 springboot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration
12.2 @EnableAutoConfiguration的作用
12.2.1 利用EnableAutoConfigurationImportSelector给容器中导入一些组件
将 类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中
每一个这样的 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置;
以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;
@Configuration //表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件 @EnableConfigurationProperties(HttpEncodingProperties.class) //启动指定类的 ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把 HttpEncodingProperties加入到ioc容器中 @ConditionalOnWebApplication //Spring底层@Conditional注解(Spring注解版),根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效; 判断当前应用是否是web应用,如果是,当前配置类生效 @ConditionalOnClass(CharacterEncodingFilter.class) //判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器; @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing =true) //判断配置文件中是否存在某个配置 spring.http.encoding.enabled;如果不存在,判断也是成立的//即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的; public class HttpEncodingAutoConfiguration { //他已经和SpringBoot的配置文件映射了 private final HttpEncodingProperties properties; //只有一个有参构造器的情况下,参数的值就会从容器中拿 public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) { this.properties = properties; } @Bean //给容器中添加一个组件,这个组件的某些值需要从properties中获取 @ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件? public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE)); return filter; }
注意: 根据当前不同的条件判断,决定这个配置类是否生效
一但这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;12.3 所有在配置文件中能配置的属性都是在xxxxProperties类中封装者‘;配置文件能配置什么就可以参照某个功能对应的这个属性类
例如:
@ConfigurationProperties(prefix = "spring.http.encoding") //从配置文件中获取指定的值和bean的属性进行绑定 public class HttpEncodingProperties { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF‐8");