SpringBoot:@Profile注解和Spring EL

在这里插入图片描述

🏡浩泽学编程:个人主页

 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》
              《RabbitMQ》《Spring》《SpringMVC》

🛸学无止境,不骄不躁,知行合一

文章目录

  • 前言
  • 一、@Profile
    • 注解使用
      • (1) @Prifile修饰类
      • (2)@Profile修饰方法
      • (3)@Profile修饰注解
      • (4)启动激活
    • 资源配置文件
  • 二、Spring EL
  • 总结


前言

本篇文章主要讲诉多环境注入适应不同场景问题和Spring EL。


一、@Profile

  • 在企业开发的过程中,项目往往要面临开发环境、测试环境、准生产环境(用于模拟真实生产环境部署所用〉和生产环境等的切换,所以在企业开发中往往需要有多套环境,而每一套环境的上下文是不一样的。例如,它们会有各自的数据库资源,这样就要求我们在不同的数据库之间进行切换。为了方便, Spring还提供了 Profile机制, 使我们可以很方便地实现各个环境之间的切换。在使用DI来依赖注入的时候,能够根据@profile标明的环境,将注入符合当前运行环境的相应的bean
  • 使用要求
    • @Component或@Configuration注解的类可以使用@profile
    • @Profile中需要指定一个字符串,约定生效的环境

注解使用

(1) @Prifile修饰类

@Configuration
@Profile("dev")
public class MyConfig{@Bean(destroyMethod="destory")public DataSource getDevDataSource () { Properties props = new Properties();props.setProperty("driver","com.mysql.jdbc.Driver"); props.setProperty("url","jdbc:mysql://localhost:3306/dev_spring_boot") ; props.setProperty("sername","root"); props.setProperty ("password","root") ; DataSource dataSource = null; try { dataSource = BasicDataSourceFactory.createDataSource(props) ; } catch (Exception e) { e.printStackTrace() ; }return dataSource; }
}

(2)@Profile修饰方法

现在有两个数据库,使用注解@Profile 定义两个Bean

@Bean(name = "dataSource", destroyMethod = "close" )
@Profile("dev") 
public DataSource getDevDataSource () { Properties props = new Properties();props.setProperty("driver","com.mysql.jdbc.Driver"); props.setProperty("url","jdbc:mysql://localhost:3306/dev_spring_boot") ; props.setProperty("sername","root"); props.setProperty ("password","root") ; DataSource dataSource = null; try { dataSource = BasicDataSourceFactory.createDataSource(props) ; } catch (Exception e) { e.printStackTrace() ; }return dataSource; 
}
@Bean(name = "dataSource",destroyMethod = "close")
@Profile("test")
public DataSource getTestDataSource () { Properties props= new Properties() ; props.setProperty("driver", "com.mysql.jdbc.Driver"); props.setProperty("url","jdbc:mysql://localhost:3306/test_spring_boot");props.setProperty("username","root") ; props.setProperty("password", "root") ; DataSource dataSource = null; try { dataSource = BasicDataSourceFactory.createDataSource(props); }catch (Exception e) { e.printStackTrace();}return dataSource;
}

(3)@Profile修饰注解

了一个注解实现自定义场景,该注解可以使注入的bean使用dev的这个场景,后续就不再需要使用@Profile(“dev”)的方式,只需要在使用@Dev。

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

(4)启动激活

在 Spring 中存在两个参数可以提供给我们配置,以修改启动 Profile 机制, 一个是spring.profiles.active, 另一个是 spring.profiles.default。在这两个属性都没有配置的情况下, Spring 将不会启动Profile 机制,这就意味着被@Profile 标注的 Bean 将不会被 Spring装配到 roe 容器中。Spring是先判定是否存在spring.profiles.active 配置后 , 再去查找 spring.profiles.default 配置的,所以spring.profiles.active 的优先级要大于 spring.profiles.default。

在Java 启动项目中,使用dev环境,我们只需要如下配置就能够启动Profile机制(idea和eclipse的配置):
在这里插入图片描述
在这里插入图片描述

也可以打包后运行:

java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar   --spring.profiles.active=dev;

资源配置文件

  • springboot的环境隔离还可以使用多资源文件的方式,进行一些参数的配置。

  • Springboot的资源配置文件除了application.properties之外,还可以有对应的资源文件application-{profile}.properties。
    假设,一个应用的工作环境有:dev、test、prod
    那么,我们可以添加 4 个配置文件:

    • applcation.properties : 公共配置
    • application-dev.properties : 开发环境配置
    • application-test.properties : 测试环境配置
    • application-prod.properties : 生产环境配置
  • 不同的properties配置文件也可以是在 applcation.properties 文件中来激活 profile:spring.profiles.active = dev

    • 这个时候请注意,按照 Spring Boot 的规则,假设把选项-Dspring.profiles.active 配置的值记为{profile},则它会用 application-{profile}.properties 文件去代替原来默认的 application.properties 文件,然后启动Spring Boot 的程序。

例如:
application.properties:

spring.profiles.active=prod

application-prod.properties:

server.port=2222#定义一些自己使用的属性,然后通过@Value("${属性名}}")注解来加载对应的配置属性
com.name=Prod
com.location=Hubei

application-dev.properties:

# 服务端口
server.port=1111#定义一些自己使用的属性,然后通过@Value("${属性名}}")注解来加载对应的配置属性
com.name=DEV
com.location=HeNan

控制层:

@Controller
@RequestMapping("/test")
public class test {@Value("${com.name}")private String name;@Value("${com.location}")private String location;@RequestMapping("hello")@ResponseBodypublic String test1(){System.out.println(name + "hello Spring Boot, " +location);return name + ",hello Spring Boot! " +location;}
}

启动Springboot后,访问http://localhost:2222/test/hello如下:
在这里插入图片描述
访问http://localhost:1111/test/hello是报错的,因为此时激活的是prod环境,使用的是application-dev.properties配置文件。

二、Spring EL

为了更加灵活, Spring还提供了表达式语言Spring EL。通过 Spring EL 可以拥有更为强大的运算规则来更好地装配Bean。

最常用的当然是读取属性文件的值, 例如

@Value("${database.driverName}")
String driver

这里的@Value 中的${......}代表占位符,它会读取上下文的属性值装配到属性中,这便是一个最简单的Spring 表达式。 除此之外,它还能够调用方法,例如,我们记录一个Bean 的初始化时间:

@Value ("#{T(System).currentTimeMillis()}") 
private Long initTime = null; 
  • 这里采用 #{.....}代表启用 Spring 表达式,它将具有运算的功能;
  • T(…)代表的是引入类:System 是java.lang.*包的类, 这是 Java 默认加载的包,因此可以不必写全限定名,如果是其他的包,则需要写出全限定名才能引用类: currentTimeMillis 是它的静态(static)方法,也就是我们调用一次System.currentTimeMillis()方法来为这个属性赋值。

此外还可以给属性直接进行赋值

//赋值字符串
@Value( "#{'使用 Spring EL 赋值字符串'}"private String str = null; //科学计数法赋值
@Value("#(9.3E3}") 
private double d; //赋值浮点数
@Value ("#(3.14 }") 
private float pi;

还可以获取其他Spring Bean 的属性来给当前的Bean属性赋值

@Value ("#{beanName.str}")
private String otherBeanProp = null;
  • beanName 是 Spring IoC 容器 Bean 的名称。
  • str 是其属性,代表引用对应的 Bean的属性给当前属性赋值。

有时候, 我们还希望这个属性的宇母全部变为大写,这个时候就可以写成:

@Value("#{beanName.str?.toUpperCase()}")
private String otherBeanProp = null;

再次注意这里的Spring EL。这里引用由属性后跟着是一个?,这个符号的含义是判断这个属性是否为空。如果不为空才会去执行toUppercase 方法,进而把引用到的属性转换为大写,赋予当前属性。

还可以使用 Spring EL进行一定的运算

# 数学运算
@Value ("#{1+2}") 
private int run; 
# 浮点数比较运算
@Value ("#{beanName.pi == 3.14f}") 
private boolean piFlag; 
# 字符串比较运算
@Value ("#{beanName.str eq 'Spring Boot'}") 
pri. vate boolean strFlag; 
# 字符串连接
@Value ("#{beanName.str + ' 连接字符串 '}"private String strApp = null; 
# 三元运算
@Value ("#{beanName.d > 1000 ? '大子' : '小子'}"private String resultDesc = null; 

从上面的代码可以看出, SpringEL 能够支持的运算还有很多,其中等值比较如果是数字型的可以使用=比较符,如果是字符串型的可以使用 eq 比较符。


总结

以上就是多环境注入和Spring EL的全部讲解。

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

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

相关文章

5年前端仔的2023年终总结

突然发现已经有好几个月没有写过博客总结过什么,小小辩解一下,其实并不是笔者停止的学习和总结,随着在前端这个行业的逐年深入,渐渐的很多收获不再是像之前简单的技术点的确定性描述讲解了,而是某个领域的知识体系的串…

数智文旅:智慧文旅中的数字化转型

在数字化浪潮席卷全球的今天,旅游业作为传统服务业的代表,正面临着前所未有的转型压力与机遇。智慧文旅,作为旅游业与数字技术深度融合的产物,不仅标志着旅游业进入了全新的发展阶段,更预示着未来旅游业将朝着更加智能…

ruoyi-nbcio中xxl-job的安装与使用

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址: http://122.227.135.243:9666 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbach…

单片机接收PC发出的数据

#include<reg51.h> //包含单片机寄存器的头文件 /***************************************************** 函数功能&#xff1a;接收一个字节数据 ***************************************************/ unsigned char Receive(void) { unsigned char dat; …

Android.mk 语法详解

一.Android.mk简介 Android.mk 是Android 提供的一种makefile 文件,注意用来编译生成&#xff08;exe&#xff0c;so&#xff0c;a&#xff0c;jar&#xff0c;apk&#xff09;等文件。 二.Android.mk编写 分析一个最简单的Android.mk LOCAL_PATH : $(call my-dir) //定义了…

云计算 - 弹性计算技术全解与实践

一、引言 在过去的十年里&#xff0c;云计算从一个前沿概念发展为企业和开发者的必备工具。传统的计算模型通常局限于单一的、物理的位置和有限的资源&#xff0c;而云计算则通过分布式的资源和服务&#xff0c;为计算能力带来了前所未有的"弹性"。 弹性&#xff1a;…

###C语言程序设计-----C语言学习(10)#函数再探

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 目录 一. 基础知识的学习 1.不返回结果函数 2.局部变量 3.全局变量 4.…

盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?

写在开头 在Java的世界里万物皆对象。但我认为是万物皆数据&#xff0c;世界由各种各样数据构建起来&#xff0c;我们通过程序去实现数据的增删改查、转入转出、加减乘除等等&#xff0c;不同语言的实现方式殊途同归。由此可见&#xff0c;数据对于程序语言的重要性。 这段话…

6.electron之上下文隔离,预加载JS脚本

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中&#xff0c;因此它允许你仅需一个代码仓库&#xff0c;就可以撰写支持 Windows、…

ClickHouse时区

clickhouse数据库的时间是UTC时间。服务器默认的是上海时间。 sudo vim /etc/clickhouse-server/config.xml clickhouse默认的时区是注释的就是UTC时间 %F 表示日期&#xff0c;格式为 YYYY-MM-DD。%T 表示时间&#xff0c;格式为 HH:MM:SS。 因此&#xff0c;formatDateT…

【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 命名空间 命名空间的定义 命名空间的使用 命名空间的嵌套使用 C输入&输出 std命名空间的使用惯例&…

Mysql-数据库优化-客户端连接参数

客户端参数 原文地址 # 连接池配置 # 初始化连接数 spring.datasource.druid.initial-size1 # 最小空闲连接数&#xff0c;一般设置和initial-size一致 spring.datasource.druid.min-idle1 # 最大活动连接数&#xff0c;一个数据库能够支撑最大的连接数是多少呢&#xff1f; …