Spring Boot 简介
什么是Spring Boot
Spring boot是构建所有基于Spring应用程序的启动。 它消除了设置 Spring应用程序所需的xml配置,Spring boot整合了所有的框架,为更快,更高效的开发生态系统铺平了道路,它的核心思想是:约定优于配置,Spring boot开发细节都是依据此思想就行实现的。
总结:
基于Spring升级或者再次封装的一个框架,消除了spring框架的xml配置,提高了开发效率,核心思想,约定大于配置
Spring Boot 的优势
(1)Spring Boot 使开发变得简单,提供丰富解决方案,快速集成各种解决方案提升开发效率。
(2)Spring Boot 使配置变得简单,提供丰富的Starters(启动器),集成开源产品只需要简单的配置
(3)Spring Boot 使部署变得简单,内嵌启动容器,仅需要一个命令启动项目。
(3)Spring Boot 使监控变得简单,自带监控组件,使用Actuator(执行器),轻松监控服务各项状态
Spring Boot 的核心
约定优于配置
约定优于配置(Convention Over Configuration),也称作按约定编程是一种软件设计范式。目的在于减少软件开发人员所需要做出的决定的数量,从而获得简单的好处,而又不失去其中的灵活性。
本质是说:开发人员只需要规定应用不符约定的部分
Spring Boot JPA就是约定优于配置最佳实现之一,不需要关注表结构,我们约定类名即为表名,属性名即是表的字段,特殊要求的属性,我们需要单独配置,按照这个约定我们可以将以前的工作大大的简化。
Spring Boot的体系将约定优配置思想展现的淋漓尽致,小到配置文件,中间件的默认配置,大道内置容器,生态中的各种Starter(启动器)无不遵循此设计规则。Starter核心之一就是autoconfigure(自动配置)模块,在启动的时候就行装配,属性默认化配置。
Spring boot简化配置和众多的Starter才让Spring boot变的简单,约定优于配置让Spring boot容易上手
Starters 启动器
Starter可以理解成启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例和依赖包。
Spring boot Starter基于约定优于配置的理念设计,Spring boot Starter中有两个核心组件:自动配置代码和提供自动配置模块及其它有用的依赖。
Spring boot整合了主流的开源软件形成一系列的Starter,形成了一致的编程体验来集成各种软件,Spring boot在集成做出了巨大的优化,让我们集成的时候只需要很少配置和代码来实现,可以说各种Starter就是Spring boot最大的优势之一。
常用的Spring Boot Starter列表
总结:
Starter是Spring Boot官方让我们管理依赖更加方便,整合了主流开源软件形成了一系列Starter,通过简单的配置某个Starter就可以使用此软件默认功能。
自动配置工作原理
@SpringBootApplication启动注解类
//约定大于配置
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication注释里面又包括三个注解:
@SpringBootConfiguration:SpingBoot配置;
@EnableAutoConfiguration:自动配置;
@ComponentScan:组件扫描。
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}
@SpringBootConfiguration里面又包含了@Configuration注解,使用@Configuration注解标注的类表示一个配置类,可以代替xml配置bean,意味着可以在启动类中添加带有@Bean注解的方法进行一些配置。
@ComponentScan注解表示扫描组件,启动类间接包含该注解,表示会扫描启动类所在的包及子包下的注解配置。
@EnableAutoConfiguration注解开启配置,它主要通过@Import注解导入了AutoConfigurationImportSelector类
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
AutoConfigurationImportSelector有很多方法,自动配置生效最主要的方法之一就是getCandidateConfiguration方法
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
getCandidateConfiguration方法会调用SpringFactoriesLoader.loadFactoryNames()方法,
该方法会查找spring-boot-autoconfigure.jar中定义的META-INF/spring.factories文件
spring.factories文件中定义了应用运行是所有可能自动配置的类,每用过xxxAutoConfiguration类都是容器中的一个组件,会加入到spring容器中,加入到容器中的作用就是用它们来做自动配置,这就是spring Boot自动配置之源
Starter 的启动过程
- Spring Boot 在启动时会去依赖Starter包中寻找spring.factories文件,然后根据文件中的配置的jar包去扫描项目所依赖的jar包
- 根据spring.factories配置价值AutoConfigure类
- 根据@Conditional注解条件,进行自动配置并将Bean注入Spring Context
总结:
其实就是Spring Boot在启动的时候,按照约定去读取Spring Boot Starter的配置信息,再根据配置信息对资源进行初始化,并注入到Spring容器中,这样Spring Boot启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应Bean资源即可。
Spring Boot 的配置
Spring Boot 对开发人员最大的好处在于可以对Spring应用进行自动配置,而且自动配置功能是没有侵入性的,只是作为一种基本的默认来实现的。开发人员可以通过定义其他配置,来替代自动配置所提供的功能。
全局配置文件
Sprin Boot全局配置文件:
- application.properties
- application.yml
两个文件的作用:可以覆盖Spring Boot自动配置的默认值。
application.properties 语法
com.li.name=li
com.li.email = 94235194@qq.com
创建bean引用
@Component
@ConfigurationProperties(prefix = "com.li")
public class LiInfo implements Serializable {
private String name;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
使用:
@RestController
public class Holle {
@Autowired
public DemoserviceImpl demoservice;
// @Value("${com.li.name}")
// private String name;
// @Value("${com.li.email}")
// private String email;
@Resource
private LiInfo liInfo;
@RequestMapping(value = "/hello")
public String hole(){
String msg =demoservice.sayHello();
msg +=" "+liInfo.getName()+" "+liInfo.getEmail();
return msg;
}
YAML简介:
yml是YAML(YAML Ain’t Markup Language)语言的文件,以数据为中心,比json,xml等更适合做配置文件
yml和xml相比,少了一些结构化的代码,使数据更直接,一目了然
yml和json相比,没有谁好谁坏,合适才是最好的。yml的语法比json优雅,注释更标准,适合做配置文件,而json作为一种机器交换格式比yml强,更适合做api调用的数据交换。
YAML:配置例子
server:
port: 8081
相当于XML:
<server>
<port>8081</port>
</server>
YAML语法:
1. 基本语法
k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
server:
port: 8081
path: /hello
属性和值也是大小写敏感;
2. 值的写法
字面量:普通的值(数字,字符串,布尔)
k: v:字面直接来写;
字符串默认不用加上单引号或者双引号;
“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
3. 对象、Map(属性和值)(键值对)
k: v:在下一行来写对象的属性和值的关系;注意缩进
对象还是k: v的方式
friends:
lastName: zhangsan
age: 20
行内写法:
friends: {lastName: zhangsan,age: 18}
4. 数组(List、Set):
用- 值表示数组中的一个元素
pets:
- cat
- dog
- pig
行内写法
pets: [cat,dog,pig]
5. 配置文件值注入
配置文件 application.yml
person:
lastName: hello
age: 20
boss: true
birth: 2018/03/18
maps: {k1: v1,k2: 12}
lists:
- hfbin
- zhaoliu
dog:
name: dog
age: 12
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;
使用 @ConfigurationProperties 注解在idea会给我们提示,需要导入配置文件处理器。
在pom导入配置文件处理器,以后编写配置就有提示了:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
可能会出现乱码:
自定义配置文件
1. 变量方式
第一步:application.properties增加属性
my.prop.name = 张三
my.prop.sex = 男
第二步:应用类上通过注解获取属性
@Component
public class MyClass{
@Value("${my.prop.name}")
private String name;
@Value("${my.prop.sex}")
private int sex;
}
2. 类方式
第一步:application.properties增加属性
my.prop.name = 张三
my.prop.sex = 男
第二步:定义属性寄存类
@Component
@ConfigurationProperties(prefix ="my.prop")
public class MyProp{
private String name;
private String sex;
}
注意:注解ConfigurationProperties的prefix前缀+"."+寄存类属性名称 = 配置属性的key,如 "my.prop" +"."+"name" = "my.prop.name"
第三步:应用类上通过注解获取属性
@Component
public class MyClass{
@Resource
MyProp myprop;
}