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.rhkb.cn/news/252454.html

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

相关文章

GLSL ES 1.0

GLSL ES 概述 写在前面 程序是大小写敏感的每一个语句都应该以英文分号结束一个shader必须包含一个main函数,该函数不接受任何参数,并且返回voidvoid main() { }数据值类型 GLSL支持三种数据类型: 整型浮点型:必须包含小数点&…

【大模型上下文长度扩展】FlashAttention:高效注意力计算的新纪元

FlashAttention:高效注意力计算的新纪元 核心思想核心操作融合,减少高内存读写成本分块计算(Tiling),避免存储一次性整个矩阵块稀疏注意力,处理长序列时的效率问题利用快速 SRAM,处理内存与计算…

二分查找------蓝桥杯

题目描述&#xff1a; 请实现无重复数字的升序数组的二分查找 给定一个元素升序的、无重复数字的整型数组 nums 和一个目标值 target&#xff0c;写一个函数搜索 nums 中的target&#xff0c;如果目标值存在返回下标 (下标从0 开始)&#xff0c;否则返回-1 数据范围: 0 < l…

【Java 数据结构】反射

反射 1 定义2 用途(了解)3 反射基本信息4 反射相关的类&#xff08;重要&#xff09;4.1 Class类(反射机制的起源 )4.1.1 Class类中的相关方法(方法的使用方法在后边的示例当中) 4.2 反射示例4.2.1 获得Class对象的三种方式4.2.2 反射的使用 5、反射优点和缺点 1 定义 Java的反…

网络编程套接字

目录 本节重点一、预备知识1.1 理解源IP地址和目的IP地址1.2 认识端口号1.3 理解 "端口号" 和 "进程ID"1.4 理解源端口号和目的端口号1.5 认识TCP协议1.6 认识UDP协议1.7 网络字节序 二、socket编程接口2.1 socket常见的API2.2 sockaddr结构2.3 in_addr结构…

SpringBoot集成axis发布WebService服务

文章目录 1、使用maven-web项目生成server-config.wsdd文件1.1、新建maven-web项目1.1.1、新建项目1.1.2、添加依赖 1.2、编写服务接口和实现类1.2.1、OrderService接口1.2.2、OrderServiceImpl实现类 1.3、配置deploy.wsdd文件deploy.wsdd文件 1.4、配置tomcat1.4.1、配置tomc…

MySQL数据库练习【一】

MySQL数据库练习【一】 一、建库建表-数据准备二、习题2.1. 查询部门编号为30的部门的员工详细信息2.2.查询从事clerk工作的员工的编号、姓名以及其部门号2.3.查询奖金多于基本工资的员工的信息、查询奖金小于基本工资的员工的信息2.4.查询奖金多于基本工资60%的员工的信息2.5.…

宠物空气净化器适合养猫家庭吗?除猫毛好的猫用空气净化器推荐

宠物掉毛是一个普遍存在的问题&#xff0c;尤其在脱毛季节&#xff0c;毛发似乎无处不在。这给家中的小孩和老人带来了很多麻烦&#xff0c;他们容易流鼻涕、过敏等不适。此外&#xff0c;宠物有时还会不规矩地拉扯和撒尿&#xff0c;这股气味实在是难以忍受。家人们对宠物的存…

【DC渗透系列】DC-4靶场

主机发现 arp-scan -l┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:6b:ed:27, IPv4: 192.168.100.251 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.100.1 00:50:56:c0:00:08 …

掌握Go的加密技术:crypto/rsa库的高效使用指南

掌握Go的加密技术&#xff1a;crypto/rsa库的高效使用指南 引言crypto/rsa 库概览RSA 加密算法基本原理crypto/rsa 库的功能和应用 安装和基本设置在 Go 项目中引入 crypto/rsa 库基本环境设置和配置 密钥生成与管理生成 RSA 密钥对密钥存储和管理 加密和解密操作使用 RSA 加密…

Kafka零拷贝技术与传统数据复制次数比较

读Kafka技术书遇到困惑: "对比传统的数据复制和“零拷贝技术”这两种方案。假设有10个消费者&#xff0c;传统复制方式的数据复制次数是41040次&#xff0c;而“零拷贝技术”只需110 11次&#xff08;一次表示从磁盘复制到页面缓存&#xff0c;另外10次表示10个消费者各自…

加固平板电脑丨三防智能平板丨工业加固平板丨智能城市管理

随着智能城市的不断发展&#xff0c;人们对于城市管理的要求也在不断提高&#xff0c;这就需要高效、智能的城市管理平台来实现。而三防平板就是一款可以满足这一需求的智能设备。 三防平板是一种集防水、防尘、防摔于一体的智能平板电脑&#xff0c;它可以在复杂的环境下稳定运…

【EI会议征稿通知】第三届智能控制与应用技术国际学术会议(AICAT 2024)

第三届智能控制与应用技术国际学术会议&#xff08;AICAT 2024&#xff09; 2024 3rd International Symposium on Artificial Intelligence Control and Application Technology 2024年第三届智能控制与应用技术国际学术会议&#xff08;AICAT 2024&#xff09;定于2024年5月…

Leetcode24:两两交换链表中的节点

一、题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff…

[Linux 进程控制(二)] 写时拷贝 - 进程终止

文章目录 1、写时拷贝2、进程终止2.1 进程退出场景2.1.1 退出码2.1.2 错误码错误码 vs 退出码2.1.3 代码异常终止引入 2.2 进程常见退出方法2.2.1 exit函数2.2.2 _exit函数 本片我们主要来讲进程控制&#xff0c;讲之前我们先把写时拷贝理清&#xff0c;然后再开始讲进程控制。…

JAVA面试汇总总结更新中ing

本人面试积累面试题 多线程微服务JVMKAFKAMYSQLRedisSpringBoot/Spring 1.面向对象的三个特征 封装&#xff0c;继承&#xff0c;多态&#xff0c;有时候也会加上抽象。 2.多态的好处 允许不同类对象对同一消息做出响应&#xff0c;即同一消息可以根据发送对象的不同而采用多种…

软考21-上午题-数组、矩阵

数组&#xff1a;一组地址连续的空间。 数组是定长线性表在维数上的扩展&#xff0c;即&#xff0c;线性表中的元素又是一个线性表。 一、数组 数组的特点&#xff1a; 数组数目固定&#xff0c;一旦定义了数组结构&#xff0c;不再有元素个数的增减变化。因此&#xff0c;数…

C# Onnx GroundingDINO 开放世界目标检测

目录 介绍 效果 模型信息 项目 代码 下载 介绍 地址&#xff1a;https://github.com/IDEA-Research/GroundingDINO Official implementation of the paper "Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection" 效果 …

MATLAB矩阵的操作(第二部分)

师从清风 矩阵的创建方法 在MATLAB中&#xff0c;矩阵的创建方法主要有三种&#xff0c;分别是&#xff1a;直接输入法、函数创建法和导入本地文件中的数据。 直接输入法 输入矩阵时要以中括号“[ ]”作为标识符号&#xff0c;矩阵的所有元素必须都在中括号内。 矩阵的同行元…

openssl3.2 - use openssl cmd create ca and p12

文章目录 openssl3.2 - use openssl cmd create ca and p12概述笔记实验的openssl环境建立CA生成私钥和证书请求生成CA证书用CA签发应用证书用CA对应用证书进行签名将已经签名好的PEM证书封装为P12证书验证P12证书是否可用END openssl3.2 - use openssl cmd create ca and p12 …