首页 > 其他分享 >Spring Boot Profile使用

Spring Boot Profile使用

时间:2023-04-27 22:34:17浏览次数:43  
标签:Profile Spring Boot dev spring 注解 prod public


Spring Boot使用@Profile注解可以实现不同环境下配置参数的切换,任何@Component@Configuration注解的类都可以使用@Profile注解。

例如:

@Configuration
@Profile("production")
public class ProductionConfiguration {
    // ...
}

 通常,一个项目中可能会有多个profile场景,例如下面为test场景:

@Configuration
@Profile("test")
public class TestConfiguration {
    // ...
}

spring.profiles.active来设置哪些profile被激活。spring.profiles.include属性用来设置无条件的激活哪些profile。例如,你可以在application.properties中设置:


或者在application.yaml中设置:


spring.profiles.active属性可以通过命令行参数或者资源文件来设置,其查找顺序,请参考Spring Boot特性

自定义Profile注解

@Profile注解需要接受一个字符串,作为场景名。这样每个地方都需要记住这个字符串。Spring的@Profile注解支持定义在其他注解之上,以创建自定义场景注解。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Profile("dev")
public @interface Dev {
}

@Dev注解,该注解可以标识bean使用于@Dev这个场景。后续就不再需要使用@Profile("dev")的方式。这样即可以简化代码,同时可以利用IDE的自动补全:)

多个Profile例子

下面是一个例子:

package com.javachen.example.service;
 
public interface MessageService {
  String getMessage();
}

 对于MessageService接口,我们可以有生产和测试两种实现:

package com.javachen.example.service;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
 
@Component
@Profile({ "dev" })
public class HelloWorldService implements MessageService{
 
  @Value("${name:World}")
  private String name;
 
  public String getMessage() {
    return "Hello " + this.name;
  }
 
}

 

package com.javachen.example.service;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
 
@Component
@Profile({ "prod" })
public class GenericService implements MessageService {
 
  @Value("${hello:Hello}")
  private String hello;
 
  @Value("${name:World}")
  private String name;
 
  @Override
  public String getMessage() {
    return this.hello + " " + this.name;
  }
 
}

 Application类为:

@SpringBootApplication
public class Application implements CommandLineRunner {
  private static final Logger logger = LoggerFactory.getLogger(Application.class);
 
  @Autowired
  private MessageService messageService;
 
  @Override
  public void run(String... args) {
    logger.info(this.messageService.getMessage());
    if (args.length > 0 && args[0].equals("exitcode")) {
      throw new ExitException();
    }
  }
 
  public static void main(String[] args) throws Exception {
    SpringApplication.run(Application.class, args);
  }
}

spring.profiles.active控制,你在resources/application.properties中定义spring.profiles.active=XXX,或者通过-Dspring.profiles.active=XXXXXX可以是dev或者prod或者dev,prod需要注意的是:本例中是将@Profile用在Service类上,一个Service接口不能同时存在超过两个实现类,故本例中不能同时使用dev和prod。通过不同的profile,可以有对应的资源文件application-{profile}.properties。例如,application-dev.properties内容如下:

name=JavaChen-dev

application-prod.properties内容如下:


接下来进行测试。spring.profiles.active=dev时,运行Application类,查看日志输出。

2016-02-22 15:45:18,470 [main] INFO  com.javachen.example.Application - Hello JavaChen-dev



spring.profiles.active=prod时,运行Application类,查看日志输出。

2016-02-22 15:47:21,270 [main] INFO  com.javachen.example.Application - Hello JavaChen-prod




logback配置多Profile

在resources目录下添加logback-spring.xml,并分别对dev和prod进行配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
 
    <springProfile name="dev">
        <logger name="com.javachen.example" level="TRACE" />
        <appender name="LOGFILE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
    </springProfile>
 
    <springProfile name="prod">
        <appender name="LOGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <File>log/server.log</File>
            <rollingPolicy
                    class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <FileNamePattern>log/server_%d{yyyy-MM-dd}.log.zip</FileNamePattern>
            </rollingPolicy>
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern>
            </layout>
        </appender>
    </springProfile>
 
    <root level="info">
        <appender-ref ref="LOGFILE" />
    </root>
 
    <logger name="com.javachen.example" level="DEBUG" />
</configuration>

 这样,就可以做到不同profile场景下的日志输出不一样。

maven中的场景配置

使用maven的resource filter可以实现多场景切换。

<profiles>
    <profile>
        <id>prod</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <build.profile.id>prod</build.profile.id>
        </properties>
    </profile>
    <profile>
        <id>dev</id>
        <properties>
            <build.profile.id>dev</build.profile.id>
        </properties>
    </profile>
</profiles>
 
<build>
        <filters>
            <filter>application-${build.profile.id}.properties</filter>
        </filters>
 
        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
</build>

-P参数指定maven profile即可。

总结

使用Spring Boot的Profile注解可以实现多场景下的配置切换,方便开发中进行测试和部署生产环境。

本文中相关代码在github上面。

标签:Profile,Spring,Boot,dev,spring,注解,prod,public
From: https://blog.51cto.com/u_16091571/6232254

相关文章

  • 通过在classpath自动扫描方式把组件纳入spring容器中管理
    知识点:【前面的例子我们都是使用XML的bean定义来配置组件。在一个稍大的项目中,通常会有上百个组件,如果这些这组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找及维护起来也不太方便。spring2.5为我们引入了组件自动扫描机制,他可以在类路径底......
  • 使用Spring进行面向切面(AOP)编程
    基础知识:【要进行AOP编程,首先我们要在spring的配置文件中引入aop命名空间:<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework......
  • 文件上传下载-SpringMvc
    进行文件上传时,表单需要做的准备:1.请求方式为POST:<formaction=”uploadServlet”method=”post”/>2.使用file的表单域:<inputtype=”file”name=”file”/>3.使用multipart/form-data的请求编码方式:<formaction=”uploadServlet”type=”file”name=”file”metho......
  • jeecgboot启动时日志打印所有接口,作为开发时的参考作用吧。
    主要的方式是使用了RequestMappingHandlerMapping这个bean当中保存了所有的映射、对应的controller类、方法等等的信息。在单体启动类中取出这个bean然后遍历就可以了,代码如下:/***单体启动类(采用此类启动为单体模式)*/@Slf4j@SpringBootApplicationpublicclassJeecgSyste......
  • spring boot jpa MYSQL教程mysql连接的空闲时间超过8小时后 MySQL自动断开该连接
     SunApr1608:15:36CST2023Therewasanunexpectederror(type=InternalServerError,status=500).PreparedStatementCallback;SQL[selectuserIdfromfamilyxiao_UserConnectionwhereproviderId=?andproviderUserId=?];Nooperationsallowedaftercon......
  • Spring17_配置文件知识要点5
    <bean>标签id属性:在容器中Bean实例的唯一标识,不允许重复class属性:要实例化的Bean的全限定名scope属性:Bean的作用范围,常用是Singleton(默认)和prototype<property>标签:属性注入,set方法注入使用name属性:属性名称va......
  • SpringCloud微服务架构分析说明!
    SpringCloud是一个基于SpringBoot的微服务框架,它提供了一系列的工具和组件,用于构建分布式系统中各个微服务之间的通信和互联,实现服务发现、负载均衡、分布式配置等功能。下面我们来具体解析一下SpringCloud微服务架构。服务注册与发现在微服务架构中,服务的数量非常多,因此需要一个机......
  • Spring17_配置文件依赖注入4
    一、Bean的依赖注入入门1.创建UserService,UserService内部再调用UserDao的save()方法 2.将UserServiceImpl的创建权交给Spring3.从Spring容器中获得UserService进行操作执行UserController中的main方法,检查控制台输出:二、Bean的依赖......
  • springboot分页插件的问题
    1:maven依赖的问题此类原因是与pom.xml文件中引入的分页依赖有关,由于springboot本身集成pagerhelper的分页插件,只需要引入如下依赖即可<!--spring-bootmybatispagehelper--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-st......
  • SpringBoot配置日志文件定期切割
    下面是我的配置:创建logback-spring.xml写入下面的配置<?xmlversion="1.0"encoding="UTF-8"?><configurationdebug="false"><!--定义日志文件的存储地址勿在LogBack的配置中使用相对路径--><propertyname="LOG_HOME"value=&quo......