SpringBoot2零基础到精通之profile功能与自定义starter
本文将详细讲解SpringBoot2中的profile功能和自定义starter,在文章中会通过两个实例来演示,帮助读者更好地理解。
profile功能
什么是profile
Profile是SpringBoot提供的一个在不同环境下使用不同配置的功能。比如在开发环境中使用开发配置,在测试环境中使用测试配置,在生产环境中使用生产配置等等。实现profile的方式是在application.properties文件中定义不同的配置,并在运行时使用profile来加载相应的配置。
配置文件命名规则
SpringBoot支持四种不同的配置文件命名规则,具体如下:
- application.properties
- application.yml
- application-{profile}.properties
- application-{profile}.yml
其中application.properties和application.yml是默认的配置文件,如果指定了profile,则会优先加载application-{profile}.properties或application-{profile}.yml文件。
示例
创建示例工程
首先要创建一个SpringBoot工程,并在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
然后创建以下文件:
- application.properties
- application-dev.properties
- application-test.properties
- application-prod.properties
并在这些文件中添加以下内容:
application.properties:
message=Hello
application-dev.properties:
message=Hello Dev
application-test.properties:
message=Hello Test
application-prod.properties:
message=Hello Prod
接下来创建一个Controller类:
@RestController
public class TestController {
@Value("${message}")
private String message;
@GetMapping("/test")
public String test() {
return message;
}
}
这里使用@Value注解来注入message属性的值。
运行示例
接下来我们可以运行工程并访问http://localhost:8080/test来测试不同环境下的配置是否正确。不同环境下的配置加载情况如下:
- 没有指定profile:默认使用application.properties中的配置。
- 指定dev profile:使用application-dev.properties中的配置。
- 指定test profile:使用application-test.properties中的配置。
- 指定prod profile:使用application-prod.properties中的配置。
在application.properties配置文件中不是必需加入message属性,这里加入只是为了方便演示。在实际开发中,我们可以将application.properties中的常用配置提取出来,而将不同环境下的配置分别写在不同的配置文件中,并通过SpringBoot的@Profile注解来指定使用哪个profile。
自定义starter
什么是starter
Starter是SpringBoot中的重要特性之一,它是一种约定俗成的命名方式,用于开发SpringBoot应用程序的依赖,可以帮助开发者在使用第三方库时实现快速集成,减少配置工作,提高开发效率。
自定义starter
SpringBoot已经内置了很多starter供开发者使用,但是如果需要使用第三方库中没有提供的starter,就需要自己来实现了。自定义starter需要完成以下任务:
- 编写自定义starter源码
- 添加SpringBoot自动配置
- 发布starter到Maven仓库中
示例
创建示例库
首先创建一个SpringBoot工程,该工程将是我们自定义starter的源码工程。在pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.6.1</version>
<scope>compile</scope>
</dependency>
- spring-boot-autoconfigure:该依赖是SpringBoot提供的自动配置核心库。
- spring-boot-starter:该依赖是SpringBoot提供的starter库。
创建一个自定义类,并添加一个属性msg:
@ConfigurationProperties(prefix = "my")
public class MyProperties {
private String msg = "World";
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
在类上使用@ConfigurationProperties来指定前缀为my,并添加一个属性msg。
然后创建一个自动配置类MyAutoConfiguration,实现自动配置逻辑:
@Configuration
@ConditionalOnClass(MyProperties.class)
@EnableConfigurationProperties(MyProperties.class)
public class MyAutoConfiguration {
@Autowired
private MyProperties myProperties;
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "my", value = "enabled", havingValue = "true")
public MyService myService() {
return new MyService(myProperties.getMsg());
}
}
先解释一下各个注解的作用:
- @Configuration:标识该类为Spring配置类。
- @ConditionalOnClass:当类路径下有指定的类时才加载该配置类。
- @EnableConfigurationProperties:开启@ConfigurationProperties注解的配置功能。
- @Autowired:用于依赖注入。
- @Bean:用于注册Spring Bean。
- @ConditionalOnMissingBean:当容器中不存在指定名称或类型的Bean时才注册。
- @ConditionalOnProperty:当指定属性存在且值为指定值时才注册。
创建一个Service类MyService:
public class MyService {
private String msg;
public MyService(String msg) {
this.msg = msg;
}
public String sayHello() {
return "Hello " + msg;
}
}
接下来创建一个starter模块,并将自定义的类添加到该模块下。
发布starter
将starter模块打包并发布到Maven仓库中,在使用该starter的应用中可以通过如下方式来使用:
pom.xml文件中添加依赖:
<dependency>
<groupId>com.example</groupId>
<artifactId>my-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
然后在应用中就可以注入MyService,并调用sayHello方法了:
@RestController
public class TestController {
@Autowired
private MyService myService;
@GetMapping("/test")
public String test() {
return myService.sayHello();
}
}
在访问http://localhost:8080/test时,应用会返回"Hello World"。可以通过application.properties文件中指定属性my.msg来覆盖默认值。例如:
my.msg=Jack
这时应用会返回"Hello Jack"。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot2零基础到精通之profile功能与自定义starter - Python技术站