这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
有些地方描述为四大组件,有些地方描述为四大核心原理,有些地方描述为四大神器。个人认为称呼神器更为合适。现在先描述起步依赖机制、自动配置管理。
1. 起步依赖机制
我们在使用Spring Boot搭建框架时,使用最频繁的特性就是起步依赖。所谓的起步依赖,其本质是Maven项目的对象模型,通过传递依赖,我们很容易集成第三方框架。
起步依赖最明显的特征就是它的名称中包含starter,比如要集成 Spring MVC 时,只要添加spring-boot-starter-web依赖即可。通过它的名称就可以看出,该依赖主要用于提供Web支持。当我们用SSM中的Spring MVC框架时,我们需要添加很多依赖包才能正确集成Spring MVC。而在Spring Boot中,我们无需添加这些依赖,因为Spring MVC的所有依赖包都包含在spring-boot-starter-web中。
起步依赖还有一个好处是版本管理。往常我们要集成一个第三方框架,需要知道它的版本号以及Maven如何依赖它,如果该第三方框架升级,还需要手动修改版本号并考虑是否存在版本冲突问题。而通过添加spring-boot-starter-web依赖,这一切问题都迎刃而解。
Spring Boot的起步依赖原则是,所有正式的启动程序都应遵循spring-boot-starter-*的命名格式。许多IDE中的Maven集成允许按名称搜索依赖项。例如:安装了适当的Eclipse或STS插件后,你可以再POM Editor按下Ctrl+空格组合键,然后键入spring boot starter获得完整的框架列表。Spring Boot官方集成了目前最流行的大多数应用程序框架,当我们希望集成某种功能时,只需要在官网( spring.io )或IDE中搜索对应依赖项并导入到应用即可。
当然,如果我们在使用某种功能时,官方没有对应的starter依赖,也可以自定义starter满足需求。
注意:
我们自己在自定义时,命名通常以项目名开始,而不应该以spring-boot开始,因为它是为官方的Spring Boot构件而保留的。例如命名为 thirdproject 的第三方启动程序项目通常命名为 thirdproject-spring-boot-starter。
starter-web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
maven依赖传递
当项目A依赖于B,而B又依赖于C的时候,自然的A会依赖于C,这样Maven在建立项目A的时候,会自动加载对C的依赖。
2. 自动配置管理
Spring Boot另一个非常强大的特性就是自动配置管理,通过该特性,我们可以在程序启动时向Spring容器中导入很多配置信息。在传统的Spring MVC架构中,我们一般通过繁琐的Xml文件导入配置或注入Bean;而在Spring Boot中,不需要如此复杂。
当创建一个Spring Boot应用时,会创建一个启动类,该类添加了@SpringBootApplication注解,注解内包含@EnableAutoConfiguration注解,它便是Spring Boot的自动配置管理器。通过@EnableAutoConfiguration注解,可以自动加载配置信息。
以端口设置为例,我们在application.yml中通过server.port定义好端口后,Spring Boot应用启动时就会设置为该端口号。其实,application.yml中的所有配置文件最终都会转化为实体类。Spring Boot会将配置属性的实体类的名称已Properies结尾,放在org.springframework.boot.autoconfigure包下。server.port对应的实体类就是ServerProperties,其源码如下:
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
/**
* Server HTTP port.
*/
private Integer port;
// ...
}
该类首先加入了@ConfigurationProperties注解,其作用就是定义配置属性,其中prefix是属性前缀,这里为server。因此,server.port对应的就是ServerProperties类的port属性,在程序启动时,Spring Boot配置管理器会自动将server.port装载到ServerProperties类的port属性中。
依此,我们在application.yml中定义自己的配置属性,并通过Spring Boot自动配置管理特性将其实例化到自定义类中。例如我们配置第三方的appKey和appSecret。我们在application中定义:
third:
appKey: 1
appSecret: 1
然后创建Properties类,以便提取配置信息:
@ConfigurationProperties(prefix = "third")
@Component
public class ThirdProperties {
private String appKey;
private String appSecret;
public String getAppKey() {
return appKey;
}
public void setAppKey(String appKey) {
this.appKey = appKey;
}
public String getAppSecret() {
return appSecret;
}
public void setAppSecret(String appSecret) {
this.appSecret = appSecret;
}
}
首先,将前缀设置为third,注意字段名和application.yml中定义的属性名一致;其次,必须添加@Component注解,否则无法装载到Spring容器中,这样我们就可以通过@Autowired注解注入并使用它,如:
@Autowired
private ThirdProperties thirdProperties;