SpringBoot 基本使用
SpringBoot 基本使用
优势
- 约定俗成:
- springboot有很多约定,只要按照约定就不用可以声明配置!
- 例如:controller/service等,只要放在启动类所在的包或者子包下,自动扫描!
- 零配置:
- springboot对很多配置,都有默认值,一般默认值都是经过考量,避免逐一声明
- 例如: 启动端口号 server.port = 8080 | server.servlet.context-path = /
- 依赖启动器:
- springboot推行启动器机制,依赖一个启动器,就自动依赖一个方向的所有依赖!
- 例如:导入starter-web,就相当于maven工程导入 springmvc,servlet,jackson等依赖
配置
Spring Boot中采用了大量的自动化配置,但是对开发者而言,在实际项目中不可避免会有一些需要自己手动配置,承载这些自定义配置的文件就是resources
目录下的application.yml
文件(也可以使用YAML配置来替代application.yml配置)。Spring Boot项目中的application.yml配置文件一共可以出现在如下4个位置:
- 项目根目录下的config文件夹中。
- 项目根目录下。
- classpath下的config文件夹中。
- classpath下。
如果这4个位置中都有application.yml文件,那么加载的优先级从1到4依次降低,如下图所示:
Spring Boot将按照这个优先级查找配置信息,并加载到Spring Environment中。如果开发者不想使用application.yml作为配置文件名,也可以自己定义。例如,在resources目录下创建一个配置文件app.properties,然后将项目打成jar包,打包成功后,使用如下命令运行:
java -jar dice.jar --spring.config.name=app
在运行时再指定配置文件的名字。使用spring.config.location可以指定配置文件所在目录(注意需要以/结束),代码如下:
java -jar dice.jar --spring.config.name=app --spring.config.location=classpath:/
YAML配置
无论是Properties配置还是YAML配置,最终都会被加载到Spring Environment中。Spring提供了@Value注解以及EnvironmentAware接口来将Spring Environment中的数据注入到属性上,Spring Boot对此进一步提出了类型安全配置属性(Type-safe Configuration Properties),这样即使在数据量非常庞大的情况下,也可以更加方便地将配置文件中的数据注入Bean中。
常规配置
考虑在application.yml中添加如下一段配置:
dice:
doc-disabled: false
auth-enabled: true
将这一段配饰数据注入如下Bean中:
@ConfigurationProperties("dice")
public class DiceProperties {
/**
* Doc api disabled. (Default is true)
*/
private boolean docDisabled = true;
/**
* Authentication enabled
*/
private boolean authEnabled = true;
}
- @ConfigurationProperties中的prefix属性描述了要加载的配置文件的前缀。
- 如果配置文件是一个YAML文件,那么可以将数据注入一个集合中。
- Spring Boot采用了一种宽松的规则来进行属性绑定,如果Bean中的属性名为authorName,那么配置文件中的属性可以是dice.author_name、dice.author-name、dice.authorName或者dice.AUTHORNAME。
复杂配置
YAML还支持列表的配置,例如下面一组配置:
my:
name: 胖哥
address: China
favorites:
- 足球
- 徒步
- Coding
这一组配置可以注入如下Bean中:
@Component
@ConfigurationProperties(prefix="my")
public class User {
private String name;
private String address;
private List<String> favorites;
}
YAML还支持更复杂的配置,即集合中也可以是一个对象,例如下面一组配置:
my:
users:
- name: 胖哥
address: China
favorites:
- 足球
- 徒步
- Coding
- name: sang
address: GZ
favorites:
- 阅读
- 吉他
这组配置在集合中放的是一个对象,因此可以注入如下集合中:
@Component
@ConfigurationProperties(prefix="my")
public class Users {
private List<User> users;
}
public class User {
private String name;
private String address;
private List<String> favorites;
}
在Spring Boot中使用YAML虽然方便,但是YAML也有一些缺陷,例如无法使用@PropertySource注解加载YAML文件,如果项目中有这种需求,还是需要使用Properties格式的配置文件。
Profile
开发者在项目发布之前,一般需要频繁地在开发环境、测试环境以及生产环境之间进行切换,这个时候大量的配置需要频繁更改,例如数据库配置、redis配置、mongodb配置、jms配置等。频繁修改带来了巨大的工作量,Spring对此提供了解决方案(@Profile注解),Spring Boot则更进一步提供了更加简洁的解决方案,Spring Boot中约定的不同环境下配置文件名称规则为application-{profile}.properties,profile占位符表示当前环境的名称,具体配置步骤如下:
创建配置文件
首先在resources目录下创建两个配置文件:application-dev.properties和application-prod.properties,分别表示开发环境中的配置和生产环境中的配置。
其中,application-dev.properties文件的内容如下:
server.port=8080
application-prod.properties文件的内容如下:
server.port=80
这里为了简化问题并且容易看到效果,两个配置文件中主要修改了一下项目端口号。
配置application.properties
然后在application.properties中进行配置:
spring.profiles.active=dev
这个表示使用application-dev.properties配置文件启动项目,若将dev改为prod,则表示使用application-prod.properties启动项目。项目启动成功后,就可以通过相应的端口进行访问了。
在代码中配置
对于第二步在application.properties中添加的配置,我们也可以在代码中添加配置来完成,在启动类的main方法上添加如下代码,可以替换第二步的配置:
SpringApplicationBuilder builder = new
SpringApplicationBuilder(Application.class);
builder.application().setAdditionalProfiles("prod");
builder.run(args);
项目启动时配置
对于第2步和第3步提到的两种配置方式,也可以在将项目打成jar包后启动时,在命令行动态指定当前环境,示例命令如下:
java -jar dice.jar --spring.profiles.active=prod