spring之@profile注解

文章介绍了如何使用Spring的@Profile注解在不同环境中选择合适的bean,特别是针对数据源配置的切换。通过JVM启动参数或代码方式设定环境,然后根据@Profile定义的数据源配置类,实现在dev、test和onLine环境间切换。在指定环境下,对应的配置类和bean才会生效。
摘要由CSDN通过智能技术生成

目录

1、简介

2、@Profile 指定环境的方式

2.1、JVM启动参数

2.2、通过代码方式控制 

3、@Profile 实现切换数据源示例

3.1、导入依赖

3.2、新建数据源配置文件dataSource.properties

3.3、新建TestProfileConfig.java 配置类

3.4、新建测试类TestProfile.java

4、使用总结


1、简介

        在Spring容器中如果存在同一类型的多个组件,可以使用@Profile注解标识实际要获取的是哪一个bean,这在不同的环境使用不同的变量的场景下非常有用

        最典型的例子:开发环境、测试环境、生产环境会配置不同的数据源,在尽量不修改代码的情况下,可以使用这个注解来动态指定要连接的数据源


2、@Profile 指定环境的方式

2.1、JVM启动参数

运行的时候给虚拟机参数位置增加 -Dspring.profiles.active=dev 

2.2、通过代码方式控制 

  • 首先创建一个AnnotationConfigApplicationContext

  • 设置环境变量,指定要激活的环境

  • 注册配置类

  • 启动的时候刷新容器


3、@Profile 实现切换数据源示例

3.1、导入依赖

<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.44</version>
</dependency>

3.2、新建数据源配置文件dataSource.properties

dataSource.user=root
dataSource.password=123
dataDriveClassName=com.mysql.jdbc.Drive

3.3、新建TestProfileConfig.java 配置类

package com.spring.config;
 
 
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
import org.springframework.util.StringValueResolver;
 
 
import javax.sql.DataSource;
import java.beans.PropertyVetoException;
 
 
// 加载配置文件
@PropertySource("classpath:/dataSource.properties")
@Configuration
public class TestProfileConfig implements EmbeddedValueResolverAware {
 
 
    // 通过@Value注解获取配置文件dataSource.user的值
    @Value("${dataSource.user}")
    private String user;
    private StringValueResolver resolver;
    private String  dirveClassName;
    /**
     * 开发环境
     **/
    @Profile("dev")
    @Bean
    public DataSource dataSourceDev(@Value("${dataSource.password}") String pwd) throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/dev_db");
        dataSource.setDriverClass(dirveClassName);
        return dataSource;
    }
    /**
     * 测试环境
     **/
    @Profile("test")
    @Bean
    public DataSource dataSourceTest(@Value("${dataSource.password}") String pwd) throws PropertyVetoException{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test_db");
        dataSource.setDriverClass(dirveClassName);
        return dataSource;
    }
    /**
     * 生产环境
     **/
    @Profile("onLine")
    @Bean
    public DataSource dataSourceOnLine(@Value("${dataSource.password}") String pwd) throws PropertyVetoException{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setUser(user);
        dataSource.setPassword(pwd);
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/online_db");
        dataSource.setDriverClass(dirveClassName);
        return dataSource;
    }
 
 
    /**
     * 通过StringValueResolver解析dataDriveClassName的值
     **/
    public void setEmbeddedValueResolver(StringValueResolver resolver) {
        dirveClassName=resolver.resolveStringValue("${dataSource.dataDriveClassName}");
    }
}

3.4、新建测试类TestProfile.java

package com.spring.test;
 
 
import com.spring.config.TestProfileConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
 
import javax.sql.DataSource;
 
 
public class TestProfile {
    public static void main(String[] args) {
 
 
       /* 命令行动态参数:运行的时候给虚拟机参数位置增加 -Dspring.profiles.active=dev
        通过代码方式控制:
            1首先创建一个AnnotationConfigApplicationContext
            2 设置环境变量,指定要激活的环境
            3 注册配置类
            4启动的时候刷新容器
        */
        // 01  首先创建一个AnnotationConfigApplicationContext
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        //02  设置环境变量,指定要激活的环境 可以指定一个或者多个
        context.getEnvironment().setActiveProfiles("dev","onLine");
        //03  注册配置类
        context.register(TestProfileConfig.class);
        //04  启动刷新容器
        context.refresh();
        String[] names = context.getBeanNamesForType(DataSource.class);
        for (String name : names) {
            System.out.println(name);
        }
    }
}

输出结果:

dataSourceDev

dataSourceOnLine


4、使用总结

  • 针对标注了环境标识的bean,只有在这个环境被激活的时候,才会注入到容器当中。默认是default环境。
  • 如果@Profile 注解的位置在类上,相当于只有在指定该环境的情况下,整个配置类里面的配置才有机会生效。
  • 针对没有标注环境表示的bean,在任何环境下都可以被正常加载。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值