spring boot 学习笔记
Spring 快捷键笔记:
psvm 主方法的快捷键
Ctrl+n打开自动搜索
Alt + Insert 快捷生成 get set toString 等方法
@RestController 将controller的注解和resposeBody 注解结合起来 每个返回的数据都用json数据格式封装
@configuration//表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
@EnableConfigurationProperties(HttpEncondingProperties.class) //启动指定类的功能ConfigurationProperties功能;将配置文件中对应的值和httpEncodingProperties绑定起来;
@ConfigurationProperties(prefix="spring.http.encoding")//从配置文件中获取指定的值和bean 属性进行绑定
@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,也是默认生效的;
@Bean //给容器中添加一个组件,这个组件的某些值需要从properties中获取
@ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件
基于spring 3.0 简化spring 应用开发一个框架,
可 Spring boot javaEE 一站式的解决方案
Spring cloud 分布式 整体解决方案;
可以简化配置 Spring 配置 以及主流框架
使用嵌入式的Servlet容器,应用无需打成WAR包
starts自动依赖 与版本孔子
大量的自动配置 简化开发,可以修改默认值
无需配置xml文件,没有代码生成,开箱即用
准生产环境的运行时应用监控
与与计算的天然集成
缺点:入门容易 ,精通难;
微服务:架构风格,一个应用就是一组小型服务,可以通过HTTP 来访问
每一个功能元素 独立出来,元素动态 功能的复制
每一个功能元素都是可以独立替换,独立升级的软件的单元
每一个功能元素都可以通过http通信
部署和运维很大的困难
spring cloud 进行分布式管理
maven设置:
maven 的setting 设置自己的jdk版本
实现holle word 的基本运行
1.创建一个jar工程
2.导入spring boot 的依赖
3.编写一个主程序 启动spring boot
@SpringBootApplication 标记一个主程序 主配置类
4.运行主程序
5.发布项目
创建一个可执行的jar包
spring maven 的项目中有父项目 管理依赖
以后导入jar 包 默认的依赖是不用写版本 版本仲裁
2.导入 依赖 spring boot starter -web spring boot 的帮我们导入了
web 模块 依赖,
starter 相关依赖的 启动器 在spring 官网 spring boot 将所有的功能场景导入
进来 版本由spring boot 父依赖管理
@SpringBootApplication 配置类将会扫描 该包和子包所有的组件都扫描进
spring
@Import EnableAutoConfigurationImportSelector 导入哪些组件的选择器
将所有需要导入的组件以全类名的方式返回。这些组件就会被添加到容器中
会给容器导入非常多的自动配置类:就是给容器中导入这个场景需要的所有组件
并且配置好这些组件;
有了自动配置类就不用手动配置了;
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfigration.class,classLoader);
spring boot 启动的时候从类路径下的META-INFspring.factories中获取EnableAutoConfiguration 指定的值
将这些值自动配置类导入到容器中,自动配置类就生效,帮我们自动配置类,
j2EE 整体的解决方案都自动配置进来了
@SpringBootConfiguration ---spring boot 的一个配置类
@Configuration 配置类 类似配置文件 配置类也是容器中的一个组件
@EnableAutoConfiguration 开启自动配置
@AutoConfigurationPackage 自动配置包
@Import({Registrar.class}) spring的底层配置类 impor 给容器中
导入一个组件,导入的组件由AutoConfigurationPackage管理
以前的开发: 页面 和 后台都写入 一个war包中,开发部署简单, 水平扩展简单
日益增长的软件需求 牵一发而动全身;
如何创建一个快速的spring boot 项目
选择我们需要的模块,然后spring boot 会创建 并且导入模块
默认的主程序已经生成 我们只需要完成自己逻辑
默认生成一个生成一些 结构
resource 文件夹中的目录结构
1.static :保存所有的静态资源包括js css images;
2.tempates:保存所有的模版页面 (Spring Boot 默认jar包使用
嵌入式的Tomcat ,默认不支持jsp页面) 可以使用模版引擎(freemarker,thymeleaf)
3.application.properties:Spring boot 应用配置文件,可以修改一些默认配置,比如在里面修改 tomcat 的访问端口号
用代码进行修改 如 server.prot=8081;
Spring boot 配置文件
使用2中默认的配置文件 配置文件名字是固定的
1.application.properties
2.applicaion.yml
当properties 和 yml 配置文件中都修改了 tomcat 端口号,spring boot 中优先加载properties 中的配置文件
配置文件的作用:修改spring boot 自动默认配置文,spring boot 在底层都给我们配置
以前的配置文件都是xml 配置文件
现在出现yml 以数据为中心 比json xml 更适合做配置文件
出现新的语法格式
比如:
server:
port:8081
以前的xml文档需要配置标签等一下 yml 更加的简洁
2.YAML(yml基本语法)
k:(空格) v:表示一对键值对(空格必须有)
以空格的缩减来控制层级关系 ;只要左对齐的一列数据,都是同一个层级的数据
server:
port:801
path:/hello
属性和值大小写敏感
值的写法 值和属性必须有空格
普通的值 (数字,字符串,布尔)
k: v:字变量直接写
字符串默认不用 加上单引号 或者双引号
"":双引号不会转义字符串里面的特殊字符 特殊字符作为本身想要表示的意思
name:"zhangsan\n lisi" :输出 zhang san 换行 lisi
' ': 单引号会转义字符 特殊字符最终只是一个普通的字符串数据
name:"zhangsan\n lisi" :输出 zhang san \n lisi
对象或者Map (属性和值)键值对
k: v: 在下一行来写对象的属性和值的关系 注意缩进
对象还是以k: v的方式
friends:
lastname:zhangsna
age:20;
行内写法:
friends :{lastName: zhansan,age: 21}
数组的写法 用 -值来表示数组中一个的元素
如
pets:
-dog
-cat
-pig
行内写法:pets:[dog,cat,pig]
3.获取配置文件的值:
在yml 文件中 写对象变量的值,通过spring boot 的导入,来获取配置文件的
yml 文件中编写:person:
lastName: hello
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: 12}
lists:
‐ lisi
‐ zhaoliu
dog:
name: 小狗
age: 1
javabean 中编写:
/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定; * prefix = "person":配置文件中哪个下面的所有属性进行一一映射 * * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能; * */
@Component
@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;
}
<!‐‐导入配置文件处理器,配置文件进行绑定就会有提示‐‐>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐configuration‐processor</artifactId>
<optional>true</optional>
</dependency>
properties 配置文件中 如果写 中文 可能出现 中文乱码问题
在 Other Setting 配置即可 File Encoding 设置 utf-8 ASC码
还可以用spring 原来的 注解 @Value("${person.last-name}"); 在定义的变量上
person.last-name(实例 在properties 文件中编写数据)
支持/${person.last-name} 字面量 从环境变量,配置文件中获取值/#{Spel}
@configurationProperties获取值比较@Value
1.批量注入配置文件的属性 只能一个一个配置
2.支持松散绑定 松散语法 不支持松散语法 (-后面的英文小写)
3.不支持Sqel 语法 支持
4.JSR303数据校验 注解(@validated)不支持
5.复杂类型封装支持 不支持
只是在某个业务逻辑中只是获配位文件中的某项值 只用@Value
如果要从配置文件中加载 JavaBean 映射 配置文件中的值我们使用@configurationProperties
@configurationProperties 默认从全局配置文件中获取值
4.
@PropertySource(value="classpath:person.properties")//指定类加载配置文件的地址
@ImportResource(locations={"classpath:beans.xml",""}) :导入Spring 的配置文件,让配置文件里面的内容生效
Spring boot 里面没有Spring 配置文件 我们自己配置spring 文件也不能自动识别
需要用@ImportResource来加载到spring 配置文件
1.配置类===Spring 配置文件
Spring boot 推荐给容器中添加组件的方式:全注解的方式实现
@Configuration :指明当前类是一个配置类,就是来替代之前的spring 配置文件
配置文件中用<bean></bean>添加标签组件
@Bean 替代 <bean></bean>标签 将方法的返回值 添加到容器中
容器中这个组件的默认的id就是方法名
5.配置文件中的占位符
${random.uuid} //配置文件中的语法 properties 和 yml
占位符的运用 :指定默认值 ${Person.hello:hello}
占位符获取之前配置的值 如果没有可以用:指定默认值
6.Profile 是Spring 对不同环境提供不同配置功能的支持,可以通过激活
指定参数等方式快速切换环境
在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml
默认使用application.properties 的配置
激活指定profile
1.在配置文件中指定spring.profiles.action=dev(dev就是 profile 取不一样的名字)
yml 中进行文档块 ---三个- 定义文档块 spring: profile: dev(定义文档块)
2.命令行的激活
3.虚拟机参数 激活 -Dspring.profile.active=dev
spring boot 的配置文件的加载的优先级
高优优先级覆盖低优先级
当前目录的根目录 最高
当前目录的config 目录;
classpath:/config 目录
classpath: ..目录
spring boot 会全部加载4个目录的配置文件,这样加载可以进行互补配置;
项目打包好之后,使用命令行参数的形式,启动项目的时候来指定配置文件的新位置。
----指定配置文件和默认的配置文件会都加载,形成互补配置
----可以通过命令行:--spring.config.location来改变默认的配置文件位置
7:外部配置文件加载顺序:
官方文档 提供17种
spring boot 也可以从以下位置加载配置,优先级从高到低
高优先级会覆盖低优先级,所有配置会形成互补配置
(这里的优先级从高到低)
1.命令行 --server.port=8087 所有的配置都可以在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc 多个配置用空格分开; --配置项=值
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值由jar包外向jar包内进行寻找;
优先加载带profile
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
再来加载不带profile
8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性所有支持的配置加载来源;
第二十个视频 知识要点:
1.配置文件到底写什么,怎么写。 自动配置原理
配置文件能配置的属性参照
@SpringBootAppaction 注释在主类上,开始spring boot的工程
自动配置原理:
1.spring boot 启动的时候加载主配置类,开启了自动的配置功能,@EnableAutoConfiguration
2.@EnableAutoConfiguration 作用:
-利用 EnableAutoConfigurationImportSelector给容器中导入了一些组件
-可以插件selectImports()方法内容;
-list<String > configurations=getCandldateConfigurations(annotatlonMetadate, attributes);获取候选的配置
SpringFactoriesLoader.loadFactoryNames()
扫描所有jar包类路径下 META-INF/spring.factoties
把扫描到的这些文件的内容包装成properties对象;
从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中
将类路径下的 META-INF/spring.factories里面配置所有EnableAutoConfiguration的值加入到了容器中;
每一这样的类 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置;
3.每一个自动配置类进行自动配置功能呢;
4.以HttpEncodingAutoConfiguration 为例解释自动配置原理
一但这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取 的,这些类里面的每一个属性又是和配置文件绑定的;
5.所有在配置文件中能配置的属性都是在xxxProperties类中封装着,配置文件能配置什么就可以参照某个功能对应这个属性类
@ConfigurationProperties(prefix = "spring.http.encoding") //从配置文件中获取指定的值和bean的属 性进行绑定
public class HttpEncodingProperties{
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF‐8");
}
因此我们可以在 appliaction.properties 或者 appliaction.yml 配置文件中添加配置属性
例如:spring.http.encoding.enabled=true
spring.http.encoding.charset=utf-8
spring.http.force=true
//我们能配置的属性都是来源于这个功能的proprties类
Spring boot的精髓:
1.Spring Boot 启动会加载大量的自动配置类
2.我们看我们需要的功能有没有Spring Boot 默认写好的自动配置累;
3.我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
4.给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值;
xxxAutoConfiguration:自动配置类
给容器中添加组件
xxxProperties:封装配置文件中相关属性;