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

目录

一、@Profile 注解的作用

二、@Profile 指定环境的方式

2.1 JVM启动参数

2.2 通过代码方式控制:

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

3.1 导入依赖

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

3.3 新建TestProfileConfig.java 配置类

3.4 新建测试类TestProfile.java

四、使用总结


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

       ef796ddca0a68683eae6e3ceb01fb86e.png        

一、@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,在任何环境下都可以被正常加载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传递参数的2种情况的理解。

最近差不多一个月没写博客了&#xff0c;主要的原因是目前在使用 Markdown 写学到的一些心得&#xff0c;一方面方便记笔记&#xff0c;另一方面页面排版更加的美观。 个人笔记站点 : https://yewenxiang23.github.io 碰到的问题&#xff1a; 今天碰到一个关于传递参数的问题&a…

电脑技巧:电脑卡顿的4个优化小技巧,太有用了

目录 一、调整电脑处理器性能 二、关闭系统自动更新 三、设置“处理器”个数 四、开机加速 电脑经常卡顿&#xff0c;就会严重影响了大家的工作效率&#xff0c;其实你的电脑可以开启“加速”优化设置来提升电脑的性能&#xff0c;今天小编就来给大家分享四个能减少电脑卡顿的实…

电脑技巧:微软电脑管家测试版发布,赶快来体验一下

目录 1、前言 2、官网地址 3、安装界面 4、运行主界面 5、功能介绍 5.1电脑体验 5.2 病毒查杀 5.3 垃圾清理 5.4 优化加速 6、总结 1、前言 2022年1月底&#xff0c;有开发者在网上放出了微软电脑管家V1.0的内测安装包&#xff0c;宣称是微软中国的团队自主研发的针对Winows操作…

Spring系列(十二):AOP相关知识笔记

目录 1、AOP定义 2、AOP的用途 3、AOP常用的注解 4、AOP实现Web统一日志Demo 4.1 新建IErrorCode.java 接口类 4.2 新建ResultCode.java 接口类 4.3 新建WebLog.java 4.4 新建WebLogAspect.java 类 4.5 新建测试控制器TestLogController.java 今天给大家分享AOP相关的知识&…

跨域学习笔记2--WebApi 跨域问题解决方案:CORS

自己并不懂&#xff0c;在此先记录下来&#xff0c;留待以后学习... 正文 前言&#xff1a;上篇总结了下WebApi的接口测试工具的使用&#xff0c;这篇接着来看看WebAPI的另一个常见问题&#xff1a;跨域问题。本篇主要从实例的角度分享下CORS解决跨域问题一些细节。 WebApi系列…

电脑技巧:16个系统优化设置小技巧,大幅度提升你的电脑性能

目录 1. 注册你的Microsoft账户 2. 夜间模式 3. 关闭登录验证&#xff08;办公机慎用&#xff09; 4. 文件内容预览 5. 组件升级 6. 剪贴板增强 7. Caps Lock声音提醒 8. 自启动清理 9. 安装PowerToys 10. 文件历史记录 11. 动态锁 12. 就近共享 13. 搜索范围 14. “勒索”防护…

mongo文档操作

1.插入文档&#xff08;插入一行记录&#xff09; db.集合的名字.insert({}) 2.批量的插入 shell的for循环 3.save操作 save操作和insert操作的区别在于 如果_id相同的情况下&#xff0c;insert操作是会报错的&#xff0c;save则会更新。 4 删除列表中的所有数据 db.集合名字.r…

网络技巧:WiFi越用越慢的原因以及解决方法

WiFi越用越慢&#xff0c;到底是什么原因&#xff0c;今天小编给大家聊聊这个问题&#xff01; 有人认为是WiFi盒子有问题&#xff0c;但其实和路由器的错误摆放也有一定关系。 今天给大家列出了几种路由器正确摆放的小技巧&#xff0c;而且不用花一分钱&#xff0c;就可以测试…

Win11系统各个版本之间的比较,看完你就懂了

目录 1、Win11系统哪个版本最好&#xff1f; 2、Win11有几个版本&#xff1f; 3、Windows11不同版本的比较 Win11系统是微软全新发布的电脑操作系统&#xff0c;当然Win11有着很多的版本&#xff0c;每一个版本功能定位都有一定的差异&#xff0c;那么Win11系统哪个版本最好呢&…

电脑:分享八个实用的电脑技巧

目录 1、会高效使用搜索&#xff0c;不要什么事都问别人。 2、要会正确下载、安装、卸载软件 3、会使用Office办公软件 4、掌握如何设置路由器、设置网络等网络技能 5、熟练使用键盘 6、定期整理自己的电脑桌面 7、定期优化自己的电脑 8、掌握一些常用的快捷键 电脑是目前从事办…

SpringMVC(十七-二十) ModelAttribute 注解

有点难理解。 修饰方法是表示在该控制器的所有目标方法执行前都执行该modelattribute注解的方法。 修饰参数是表示什么&#xff1f;修饰参数时modelattributes(value"xxxx") User user 中的value值需要和modelattribute修改的方法加入的键的值一致。 Controller Cod…

硬件知识:U盘缩水是怎么回事,如何恢复U盘真实容量?

使用缩水的U盘会造成什么后果呢&#xff1f;使用缩水U盘拷贝资料&#xff0c;很有可能造成重要资料文件的丢失&#xff0c;同时“无限制”拷贝资料&#xff0c;造成不可预知的错误。那要怎么办呢&#xff1f;其实最有效方法就是还原缩水U盘真实容量&#xff0c;这样在拷贝资料时…

网络知识:内网、外网、宽带、带宽、流量、网速之间的联系?

相信很多人都不知道内网、外网、宽带、带宽、流量、网速之间的区别与联系&#xff0c;今天小编给大家介绍一下&#xff0c;希望对大家能有所帮助&#xff01; 一.带宽与宽带的区别是什么&#xff1f; 带宽是量词&#xff0c;指的是网速的大小&#xff0c;比如1Mbps的意思是一兆…

Java技术:SpringBoot实现邮件发送功能

目录 1、创建一个基本的SpringBoot项目&#xff0c;pom文件导入发送邮件的依赖 2、application.yml 文件配置配置邮件发送信息 3、创建IEmailService 接口文件&#xff0c;定义邮件发送的接口 4、创建IEmailService接口的实现类EmailService.java 文件 5、新建邮件发送模板 ema…