Spring注解驱动开发三切换环境Profile

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: Spring注解驱动开发三切换环境Profile

@Profile注解

Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能。指定组件在哪个环境的情况下才能被注册到容器中,不指定则任何环境下都能注册这个组件。



可以通过如下四种方式指定Bean生效的环境。

ConfigurableEnvironment.setActiveProfiles
AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME =spring.profiles.active
web.xml配置
@ActiveProfiles注解

接口类如下:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ProfileCondition.class)
public @interface Profile {
  /**
   * The set of profiles for which the annotated component should be registered.
   */
  String[] value();
}


① 如果不加@Profile注解,则该bean在任何环境下都被注入

@Bean
public Yellow yellow(){
  return new Yellow();
}

② 如果指定了@Profile,则只有该环境被激活的时候bean才会被注入

@Profile("dev")
@Bean("devDataSource")
public DataSource dataSourceDev(@Value("${db.password}")String pwd) throws Exception{
  ComboPooledDataSource dataSource = new ComboPooledDataSource();
  dataSource.setUser(user);
  dataSource.setPassword(pwd);
  dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/xian");
  dataSource.setDriverClass(driverClass);
  return dataSource;
}

③ 如果指定了@Profile(“default”),那么默认环境下bean会被注入

@Profile("default")
@Bean("testDataSource")
public DataSource dataSourceTest(@Value("${db.password}")String pwd) throws Exception{
  ComboPooledDataSource dataSource = new ComboPooledDataSource();
  dataSource.setUser(user);
  dataSource.setPassword(pwd);
  dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
  dataSource.setDriverClass(driverClass);
  return dataSource;
}



④ 如果@Profile配置于类上,则该类下的bean想起作用,Spring激活的环境首先要与类配置@Profile指定的环境一致,其次再看类中方法上的@Profile注解配置。

@PropertySource("classpath:/dbconfig.properties")
@Profile("dev")
@Configuration
public class MainConfigOfProfile implements EmbeddedValueResolverAware{
  @Value("${db.user}")
  private String user;
  private StringValueResolver valueResolver;
  private String  driverClass;
  @Bean
  public Yellow yellow(){
    return new Yellow();
  }
  @Profile("default")
//  @Profile("test")
  @Bean("testDataSource")
  public DataSource dataSourceTest(@Value("${db.password}")String pwd) throws Exception{
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    dataSource.setUser(user);
    dataSource.setPassword(pwd);
    dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
    dataSource.setDriverClass(driverClass);
    return dataSource;
  }
  @Profile("dev")
  @Bean("devDataSource")
  public DataSource dataSourceDev(@Value("${db.password}")String pwd) throws Exception{
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    dataSource.setUser(user);
    dataSource.setPassword(pwd);
    dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/xian");
    dataSource.setDriverClass(driverClass);
    return dataSource;
  }
}

激活环境的几种方式

① 虚拟机参数


② 代码激活

@Test
public void test01(){
  //1、创建一个applicationContext
  AnnotationConfigApplicationContext applicationContext = 
      new AnnotationConfigApplicationContext();
  //2、设置需要激活的环境
  applicationContext.getEnvironment().setActiveProfiles("dev");
  //3、注册主配置类
  applicationContext.register(MainConfigOfProfile.class);
  //4、启动刷新容器
  applicationContext.refresh();
  String[] namesForType = applicationContext.getBeanNamesForType(DataSource.class);
  for (String string : namesForType) {
    System.out.println(string);
  }
  Yellow bean = applicationContext.getBean(Yellow.class);
  System.out.println(bean);
  applicationContext.close();
}

③ web.xml

<!-- 在上下文中设置profile的默认值 -->
<context-param>
    <param-name>spring.profiles.default</param-name>
    <param-value>dev</param-value>
</context-param>
<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 在servlet中设置profile的默认值 -->
    <init-param>
     <param-name>spring.profiles.default</param-name>
     <param-value>dev</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>





相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
30天前
|
XML 开发框架 Java
Spring轻量级开发框架(二)
Spring轻量级开发框架
47 0
|
1月前
|
开发框架 安全 Java
Spring 框架:企业级应用开发的强大工具
在当今数字化时代,企业级应用开发的需求日益增长。为了满足这一需求,开发者们需要一款功能强大、易于使用的开发框架。Spring 框架作为 Java 领域的领先者,为企业级应用开发提供了全面的解决方案。本文将深入探讨 Spring 框架的各个方面,包括其历史、核心模块、优势以及应用场景。
24 0
|
1月前
|
Java 测试技术 数据库
SpringBoot:@Profile注解和Spring EL
SpringBoot:@Profile注解和Spring EL
|
1月前
|
消息中间件 Cloud Native Java
【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合
【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合
|
29天前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
66 1
|
29天前
|
存储 XML 缓存
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南(一)
【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存Cache功能的开发实战指南
66 0
|
8天前
|
存储 安全 Java
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(下)
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(下)
16 0
|
8天前
|
安全 Java 数据库
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(上)
第2章 Spring Security 的环境设置与基础配置(2024 最新版)
33 0
|
9天前
|
JSON Java fastjson
Spring Boot 底层级探索系列 04 - Web 开发(2)
Spring Boot 底层级探索系列 04 - Web 开发(2)
16 0