今天给大家分享Spring属性注入的注解@Profile 介绍,希望对大家能有所帮助!

一、@Profile 注解的作用

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

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

二、@Profile 指定环境的方式

2.1 JVM启动参数

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

2.2 通过代码方式控制:

  • 首先创建一个AnnotationConfigApplicationContext

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

  • 注册配置类

  • 启动的时候刷新容器

三、@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")@Beanpublic 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")@Beanpublic 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")@Beanpublic 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首先创建一个AnnotationConfigApplicationContext2 设置环境变量,指定要激活的环境3 注册配置类4启动的时候刷新容器*/// 01  首先创建一个AnnotationConfigApplicationContextAnnotationConfigApplicationContext 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

四、使用总结

1、针对标注了环境标识的bean,只有在这个环境被激活的时候,才会注入到容器当中。默认是default环境。

2、如果@Profile 注解的位置在类上,相当于只有在指定该环境的情况下,整个配置类里面的配置才有机会生效。

3、针对没有标注环境表示的bean,在任何环境下都可以被正常加载。

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

Spring系列(十一):@Profile 注解用法介绍相关推荐

  1. Spring系列(七):@FactoryBean注解用法介绍

    今天给大家介绍@FactoryBean注解用法,希望对大家能有所帮助! 1.@FactoryBean注解介绍 FactoryBean是实现了FactoryBean<T>接口的Bean,可以 ...

  2. Spring系列(六):@Conditional注解用法介绍

    今天给大家介绍@Conditional懒加载注解用法,希望对大家能有所帮助! 1.@Conditional注解介绍 @Conditional是Spring4版本新提供的一种注解,它的作用是按照设定的条 ...

  3. Spring系列(五):@Lazy懒加载注解用法介绍

    今天给大家介绍@Lazy懒加载注解用法,希望对大家能有所帮助! 1.@Lazy 懒加载注解的概念 SpringIoC容器会在启动的时候实例化所有单实例 bean .如果我们想要实现 Spring 在启 ...

  4. Spring系列(二):Bean注解用法介绍

    今天给大家介绍一下Spring中Bean注解的用法,后续的文章给大家介绍Sping其他注解用法,希望对大家日常工作能有所帮助! 1.首先创建一个maven项目引入spring依赖 <depend ...

  5. Spring系列(十):@Autowired 和@Resource注解用法介绍

    今天给大家分享Spring属性注入的注解@Autowired 和@Resource介,希望对大家能有所帮助! 一.@Autowired 注解 1.1 介绍 @Autowired注解默认按照类型容器中找 ...

  6. Spring系列(四):@Scope注解用法介绍

    今天给大家分享Spring中@Scope注解的用法,希望对大家能有所帮助! @Scope 定义以及作用 @Scope注解主要作用是调节Ioc容器中的作用域,在Spring IoC容器中主要有以下五种作 ...

  7. Spring系列(三):@ComponentScan注解用法介绍

    今天给大家分享Spring中@ComponentScan注解的用法,希望对大家能有所帮助! 1.@ComponentScan注解的作用 @ComponentScan注解一般和@Configuratio ...

  8. 手撸Spring系列2:IOC/DI 思想(源码篇-IOC)

    说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

  9. 补习系列(22)-全面解读 Spring Profile 的用法

    目录 一.简介 二. 区分Bean对象 三. 设置Profile 3.1 WebApplicationInitializer接口 3.2 通过 web.xml定义 3.3 JVM启动参数 3.4 环境 ...

最新文章

  1. Java 多线程(二)线程间的通信应用--生产者消费者(未完)
  2. 10.Azure应用程序网关(上)
  3. web标准---html、css、js分离
  4. 图像处理与计算机视觉:基础,经典以及最近发展(1)序
  5. python123编写函数求和_Python基础之函数
  6. QT的QGraphicsItem类的使用
  7. python函数参数为类对象_将Cython类对象作为参数传递给C函数
  8. NumPy Cookbook 带注释源码 十一、NumPy 的底牌
  9. ArcGIS Server,rest路径输入要素json 格式描述
  10. 能量收集matlab程序_深港微电子学院汪飞课题组在Sensors and Actuators A: Physical上发表双谐振能量采集器论文...
  11. Matplotlib——基本用法
  12. depends的使用教程
  13. 批处理访问服务器共享文件夹,批处理设置文件访问权限的方法分享
  14. Conflux一周年 | 25分钟 VS 以太坊7个月,伍爷の硬核庆生
  15. 大数相减(解析国密sm2_bn_sub算法与自定义算法)
  16. 计算机网络——网络硬件和网络设备及其工作原理
  17. js正则表达式的使用:
  18. 舔砖加瓦(java)之java面向对象
  19. SLAM导航机器人零基础实战系列:(四)差分底盘设计——5.底盘PID控制参数整定
  20. steam上的异形扫雷游戏tametsi技巧

热门文章

  1. AutoRun Pro Enterprise II 教程--- 教你制作软件工具箱教程清晰版(教程画面清晰,教程语音可以调高)...
  2. CentOS 6.0安装JDK7
  3. 在Ubuntu 16.04 上安装和卸载matlab 2018b(Install and uninstall matlab 2018b on ubuntu)
  4. LINUX 下tcp 和 udp 套接字收发缓冲区的大小决定规则 .
  5. 纠错——【Singleton array array(0.2) cannot be considered a valid collection.】
  6. 【图像处理】——鼠标点击图像的一处,获得点击点的坐标值
  7. excel vba 从入门到精通_VBA词汇-基本元素篇
  8. Linux实战教学笔记37:企业级Nginx Web服务优化实战(上)
  9. 【error】Invalid ADAPTORNAME specified. Type 'imaqhwinfo' for a list of available ADAPTORNAMEs.
  10. Unity按钮禁用和变灰