摘要:在使用Spring Boot的过程中,需要根据项目的实际情况进行不同的配置,因此在开发过程中先会对项目进行配置,如项目名称的设置、项目启动的端口号配置等。本节介绍Spring Boot的一些常用配置。
在使用Spring Boot的过程中,需要根据项目的实际情况进行不同的配置,因此在开发过程中先会对项目进行配置,如项目名称的设置、项目启动的端口号配置等。本节介绍Spring Boot的一些常用配置。
要标记一个项目为Spring Boot项目,需要在启动类上标记注解@SpringBootApplication,启动类必须在最外层的目录上。Spring官方约定:项目源码都在启动类的同级目录及其子目录下。
@SpringBootApplication的部分源码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM,
classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfiguration
ExcludeFilter.class) })
public @interface SpringBootApplication {
}
可以看到,@SpringBootApplication是一系列注解的综合体,下面逐一
介绍注解的含义。
@ComponentScan用于自动扫描并加载符合条件的组件(如@Component和@Repository等)或者Bean的定义,将Bean的定义加载到IoC容器中,因此SpringBoot的启动类最好放在根包下,因为默认不指定根包。
@EnableAutoConfiguration借助@Import的支持,将所有符合自动配置条件的Bean的定义加载到IoC容器中。
@SpringBootConfiguration继承自@Configuration,用于标注当前类属于配置类,其注解会将类中声明的一个或多个以@Bean注解标记的方法的返回值初始化并加载到Spring的IoC容器中,Bean的名称为方法名。
@Inherited表示此注解用在类上时会被子类继承。
@Target、@Retention和@Documented为Java自带的注解,用于定义注解@Spring- BootApplication。
Spring Boot项目启动后,默认会在控制台打印Spring字样,如图2.3所示。很多开发者喜欢把这个图案改为自己设计的图案,这是可行的。只需要在resource目录下新建一个banner.txt文件即可,其内容如下:
___ ___ ____ _ __
/ __| / __| ___ |_ / | |/ /
| (__ | (__ |___| / / | '
\___| \___| _____ /___| |_|\_\
_|"""""|_|"""""|_| |_|"""""|_|"""""|
"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'"`-0-0-'
图2.3 Spring Boot默认的Banner
再次启动Spring Boot项目,就会打印banner.txt中的内容,如图2.4所示。
图2.4 Spring Boot自定义Banner
在项目开发过程中,通常同一套程序会被部署到不同的环境中,例如开发、测试和生产(正式)环境,每个环境的数据库地址、账号、密码和服务器的端口等配置会有所不同。如果要将其部署到不同的环境而频繁地修改项目配置文件,然后再去打包项目,这样做会非常烦琐、低效,还容易出错。
而Spring Boot框架自身就支持多个环境的配置文件,它通过打包命令指定特定的配置文件来打包项目。
Spring Boot默认的配置文件名是application.properties或者application.yml,本书使用application.properties方式的配置文件,如果需要多环境的配置文件,则新的配置文件的名称需要遵从application-{profile}.properties这种格式,其中{profile}为环境的名字,例如:
application-dev.properties为开发环境配置;
application-test.properties为测试环境配置;
application-prod.properties为生产环境配置。
项目启动时加载哪个配置文件需要在application.properties文件中通过spring.profiles. active属性来指定,其值对应{profile}值。例如,设置spring.profiles.active=test,项目会加载applicationtest.properties配置文件的内容。下面演示从不同的配置文件中获取不同的值,再将其返回给前端,从而展示多环境配置的特色。还是接着介绍2.2节中的项目springboot-demo。
(1)在resources目录下新建application-dev.properties和application-test.properties两个文件,它们分别表示开发环境和测试环境的配置文件。为两个文件分别添加如下内容:
datasource.url=local
datasource.username=cc
和
datasource.url=127.0.0.1
datasource.username=zk
打开resources目录下的application.properties文件(如果没有,则创建该文件),然后增加一行spring.profiles.active=dev,表示当前使用开发环境的配置。
(2)在包com.onyx.springbootdemo.controller下新建一个ConfigController类,使用注解@Value进行值的注入。代码如下:
package com.onyx.springbootdemo.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigController {
@Value("${datasource.url}") private String url;
@Value("${datasource.username}")
private String userName;
@GetMapping("/getConfig")
public String getConfig {
return "当前配置的url:" + url + ",用户名为:" + userName;
}
}
(3)执行SpringbootDemoApplication中的main方法启动当前项目,打开浏览器访问localhost:8080/getConfig,返回配置为local和cc,如图2.5所示。
图2.5 获取开发环境的配置
(4)停止项目,修改application.properties,使配置spring.profiles.active=test,表示当前使用测试环境的配置。然后重启当前项目,执行SpringbootDemoApplication中的main方法,访问localhost:8080/getConfig会获得返回值“当前配置url:127.0.0.1,用户名为:zk”。表示spring.profiles.active=test已经生效,可以获取到不同环境的配置文件。
通过上面的示例可以看到,在有多个环境时,可以把不同的配置放置在不同的配置文件中,相同的配置直接放在application.properties文件中,这样就不需要把所有的配置都单独存放了。在开发时只需要修改不同环境的唯一变量即可,从而避免重复修改一些配置。
在使用Spring Boot进行项目开发时,还支持自定义项目配置。SpringBoot常见的配置项如表2.1所示。如果项目开发中用到了其他框架或者组件,则其对应的配置也需要添加到application.properties中,在此不一一罗列,需要时请参考Spring Boot的官方文档。
来源:程序员高级码农II一点号