SpringBoot2零基础到精通之profile功能与自定义starter

yizhihongxing

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技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java操作Apache druid的实例代码

    下面是一份针对Java操作Apache Druid的实例代码的完整攻略。 1. 安装Apache Druid 首先需要在本地或云主机上安装Apache Druid,并且按照官方文档进行配置和启动。 2. 引入依赖 在Java项目中,需要引入Druid提供的Java客户端库依赖: <dependency> <groupId>org.ap…

    Java 2023年5月20日
    00
  • Mybatis中的Criteria条件查询方式

    Mybatis中的Criteria条件查询方式是一种高级的查询方式,它允许我们通过代码生成复杂的SQL查询语句,提高查询效率。下面是详细的攻略: 什么是Criteria条件查询方式 Criteria是Mybatis中提供的一种用于生成SQL语句的API。使用它可以构建复杂的查询语句,支持动态参数和多条件查询,可以避免手写SQL语句的繁琐和可能引发的SQL注入…

    Java 2023年5月20日
    00
  • Servlet实现文件上传,可多文件上传示例

    Servlet实现文件上传 Servlet是Java Web开发中非常常用的技术,它可以实现各种业务需求。其中,文件上传就是Web开发中非常常见的需求之一。 本文将详细讲解如何通过Servlet实现文件上传功能,并提供多文件上传的示例说明。 实现步骤: 在JSP页面中添加文件上传标签,如下所示: <form action="upload&qu…

    Java 2023年6月15日
    00
  • Java集合框架概览之ArrayList源码刨析

    Java集合框架概览之ArrayList源码刨析是一个非常重要的主题,需要我们详细探讨ArrayList源码实现的细节,以下为详细攻略: 了解ArrayList基本使用和源码实现 ArrayList基本使用 ArrayList是一个基于动态数组实现的集合类,并且实现了List接口,可以重复存储相同类型的数据。ArrayList也是Java集合框架中基础的数据…

    Java 2023年5月26日
    00
  • Java Spring的两种事务你知道吗

    让我们来详细讲解一下“Java Spring的两种事务”。 什么是事务? 在计算机领域,事务是一组数据库操作,它们要么全部成功执行,要么全部失败回滚,不会出现部分操作成功、部分操作失败的情况。在Java编程中,我们可以使用Java Spring框架来管理事务。 Spring事务的两种类型 在Java Spring框架中,Spring事务主要包含两种类型:基于…

    Java 2023年6月2日
    00
  • 浅谈springboot如何保证多线程安全

    下面是关于“浅谈Spring Boot如何保证多线程安全”的攻略: 1. 了解多线程 要理解多线程安全,我们需要先了解多线程的概念。简单来说,多线程是一种执行多个任务的机制,可以让程序同时完成多项任务,提高程序的运行效率。 但是,多线程也会带来线程安全问题。如果多个线程同时访问同一个资源,就有可能造成数据的混乱或错误。 2. Spring Boot的多线程机…

    Java 2023年5月19日
    00
  • Java反射机制基础详解

    Java反射机制基础详解 Java反射机制是指在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法,在运行时刻可以调用任意一个方法或者访问任意一个属性,这种方法称之为反射机制。 反射机制主要涉及三个类:Class,Constructor和Method。 Class类 在Java反射机制中,Class是反射机制的根源,它代表了被加载进内存中的类。Cla…

    Java 2023年5月20日
    00
  • java异或加密算法

    Java异或加密算法是一种基于位运算的加密算法,它使用异或运算来加密数据,在计算机安全领域有广泛应用。下面是Java异或加密算法的详细攻略: 什么是Java异或加密算法? Java异或加密算法是一种单向加密算法(无法还原),它使用异或运算(XOR)和密钥来对数据进行加密,同时也可以用同样的密钥对密文进行解密。由于异或运算的性质,它对称性强、速度快、实现简单,…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部