简化Spring应用开发,约定大于配置,去繁从简
微服务
将每一个功能元素(独立替换、独立升级)独立出来放进一个独立的小型服务器,通过功能元素之间的动态组合完成功能。跨服务器分发这些服务进行扩展。部署和运维很困难。
开发环境
- jdk7.8
- maven 3.x
- Intellij IDEA
- Spring Boot 1.5.9RELEASE
Spring Boot HelloWorld
浏览器发送hello请求,服务器接收请求并处理,相应HelloWorld字符串
- 创建一个Maven工程;(jar) Enable auto-import
- 导入Spring Boot相关依赖
- https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#getting-started-cli-example 复制Maven Installation的配置,导入依赖。
-
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> </parent> <!-- Add typical dependencies for a web application --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
- https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#getting-started-cli-example 复制Maven Installation的配置,导入依赖。
- 编写主程序
- 创建HelloWorldMain的主程序,使用
@SpringBootApplication进行标注
SpringApplication.run(HelloWorldMain.class, args); //启动Spring 应用
5.编写相关的Controller、Service
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "HelloWorld";
}
}
6.运行主程序测试
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
导入Maven插件,该插件可以将应用打包成jar包。直接在CMD里使用java -jar执行
6.分析为何如此简便
- POM文件
-
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> </parent>
-
<parent> //上面的父项目 <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.5.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent> //它来真正管理Spring Boot应用里面的所有依赖版本,没有在dependences里面管理的依赖要声明版本号
-
- 启动器
-
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> //Spring-boot-stater-web -
Spring-boot-starter:Spring-boot场景启动器,web模块正常运行所依赖的组件
Spring Boot将所有的功能场景都抽取出来,做成一个个的starters,只需引入starter 相关场景的所有依赖都会导入进来
-
- 主程序类 @SpringBootApplication 说明该类是SpringBoot的主配置类,运行该类的main方法,来启动SpringBoot应用,组合注解。
- 其中有:@SpringBootConfiguration:Spring Boot的配置类;相当于Spring的@Configuration
配置类相当于配置文件,也是容器中的一个组件@Component
@EnableAutoConfiguration:开启自动配置功能 引入了@AutoConfigurationPackage 自动配置包 引入了
@Import(AutoConfigurationPackages.Registrar.class) //将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包的所有组件扫描的Spring容器
@Import(AutoConfigurationImportSelector.class) //导入组件选择器,将需要导入的组件以全类名的方式返回,添加到Spring容器。会给容器中导入非常多的自动配置类(xxxAutoConfiguration) 给容器中导入这个场景所需要的所有组件,并配置好这些组件。有了自动配置类,免去了我们手动编写配置注入功能组件的工作。 Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfigration指定的值,将这些值作为自动配置类导入到容器,自动配置类就生效,进行配置工作
Spring Initializer快速创建Spring Boot项目
选择所需模块,自动生成 @ResponseBody和Controller合二为一 @RestController
默认生成Spring Boot项目;已生成主程序,只需自己编写业务逻辑;
resources文件夹下有
·static:保留所有的静态资源 js css image
·templates:保存所有的模板页面 (Spring Boot 默认jar包使用嵌入式的Tomcat,默认不支持jsp),可以使用模板引擎(freemarker、thymeleaf)
·application.properties:Spring Boot应用的配置文件,可以修改默认设置
配置文件
Spring Boot设置默认值 application.properties、application.yml
YAML:以数据为中心,比json,xml更适合做配置文件
yml:
server:
port:8081
xml:
<server>
<port>8081</port>
</server>
YAML语法: 一定要加空格
- 基本语法: k:(nbsp)v: 表示一队键值对,左对齐表示同一层级,大小写敏感
- 值的写法:
- 字面量:普通的值(数字、字符串、布尔) 直接写,字符串不用加单双引号,双引号不转义字符,单引号会转义
- 对象、Map(键值对) 下一行写属性和值得关系(注意缩进)
- 数组(list 、set): 用- 值 表示数组中的元素
配置文件注入
person: lastName: zhangsan age: 20 boss: false birth: 2018/09/15 maps: {v: a,v1: b} lists: - lisi - wanger dog: name: huzi age: 3
javaBean
@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>
使用@Value相当于
与@ConfigurationProperties (...) 功能相同
数据校验 @Validated 要使用@ConfigurationProperties,@Value不支持复杂类型的封装
@PropertySource&@ImportResource
@PropertySource:加载指定的配置文件 @PropertySource(value={"classpath:person.properties"})
@ImportResource 导入Spring的配置文件,使其生效
Spring Boot推荐给容器中添加组件的方式:推荐使用全注解的方式
- 配置类====Spring配置文件 使用@Configuration指明当前类是一个配置类(相当于之前的配置文件)
- 使用@Bean给容器添加组件,这个组件默认的id就是方法名
配置文件占位符:
随机数、占位符获取之前配置的值(如果没有可以使用: 指定默认值)
Profile
Spring对不同环境提供不同配置功能的支持,通过激活、指定参数等方式快速切换环境
- 配置多个Profile文件,配置主文件名时使用 application-{profile}.properties/yml
- yml 多文档块指定 使用 --- 三个横线分割文档块
- 指定激活profile
- 配置文件中指定spring.profiles.active=xxx 来使用
- 命令行:--spring.profiles.active=xxx (可以在idea 右上角的Edit Configurations里面添加命令行参数 program arguments)
- 可以package,在命令行指定jar包运行环境
- 虚拟机参数 同样的右上角 VM options: -Dspring.profiles.active=dev
配置加载优先级
由高到低,全部加载,互补配置 命令行参数优先级最高
也可以使用外部配置进行加载
自动配置原理
3)每一个自动配置类进行自动配置功能 根据当前不同的条件判断,决定这个配置是否生效,一旦这个配置生效,这个配置类就会给容器添加各种组件,这些组建的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的
4)所有能在配置文件中配置的属性,都是在xxxProperties类中封装着。可以在对应的属性类中查看可以配置什么
精髓:
- SpringBoot启动会加载大量的自动配置类
- 我们看我们需要的功能有没有SpringBoot默认写好的自动配置类
- 看自动配置类到底配置了哪些组件(有组件就不需要再配置,没有需要自己写配置类)
- 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值
自动配置类必须在一定条件下才可生效
可以启用debug=true属性,来让控制台打印自动配置报告,可以知道哪些自动配置类生效