学习 springboot -Bean 管理(注册条件)

ops/2025/3/15 23:01:00/

前言

上一篇 博客 :学习springboot-Bean管理(Bean 注册,Bean 扫描)-CSDN博客我们了解了 bean 注册需要使用到 @Bean 和@Import  将第三方jar 包的对象 注入到ioc 容器

如下图所示

通过图片,可以看到Country 对象和Province 对象已经创建成功,现在我想要为Country 类中的 name 属性赋值

操作如下

在application.yml 配置文件给 属性name,system 赋值(差不多是这一个意思)

在CommonConfig 配置类中 使用@Value 注解为变量赋值

@Value 的使用场景

1 在成员变量上,为成员变量赋值

2 在方法的参数列表上为参数传递值

java">package com.it.heima.config;import cn.itcast.pojo.Country;
import cn.itcast.pojo.Province;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ComonConfig {@Beanpublic Country getCountry(@Value("${Country.name}") String name, @Value("${Country.system}") String system){Country country = new Country();country.setName(name);country.setSystem(system);return country;}@Beanpublic Province getProvince() {return new Province();}
}

运行截图

发现,我们成功将 Country 类中的属性赋值


操作:现在,如果把application.yml配置文件的内容注释掉,观察情况

问题

发现如果在配置文件中找不到指定映射信息,导致使用@Value 注解,无法映射到方法中的参数上,从而报错。

正文

如果使用一个注解可以随时管理注册条件:


如果配置文件有指定的信息,直接映射到方法参数上。

如果配置文件没有指定信息或者信息不对,不会因为使用@Value 注解无法映射而报错。

解决办法:SpringBoot提供了设置注册生效条件的注解@Conditional

  • 由于直接使用这个注解比较麻烦,因此使用该注解的衍生注解


注解@Conditional的衍生注解

1 @ConditionalOnProperty 注解

作用:配置文件中,配置了指定信息,则注入,否则不注入到ioc 容器中

demo(案例)

预估结果:因此接下来展示的例子是 配置文件中找不到指定信息,在启动类中使用getBean方法在ioc 容器中找不到 指定对象而报错

运行截图


2 @ConditionalOnMissingBean 注解

作用:如果 ioc 容器中不存在Country对象,则注入provice,否则不注入

demo(案例)

预测结果:根据该注解的作用,我把 这两个注解都使用在配置类中,同时注释了配置文件中的信息,以及调用 getBean方法获得Country 对象,那么按理来说 应该打印 province 对象信息

CommonConfig 配置类

java">package com.it.heima.config;import cn.itcast.pojo.Country;
import cn.itcast.pojo.Province;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ComonConfig {//配置文件中,配置了指定信息,则注入,否则不注入@ConditionalOnProperty(prefix = "Country" ,name={"name","system"})@Beanpublic Country getCountry(@Value("${Country.name}") String name, @Value("${Country.system}") String system){Country country = new Country();country.setName(name);country.setSystem(system);return country;}// 如果 ioc 容器中不存在Country对象,则注入provice,否则不注入
@ConditionalOnMissingBean(Country.class)@Beanpublic Province getProvince() {return new Province();}
}

运行截图


3 @ConditionalOnClass 注解

作用:如果当前环境中,存在DispatcherServlet类,则注入provice,否则不注入

  • 如果当前引入了web起步依赖,则存在DispatcherServlet类

格式:

@ConditionalOnClass(name={"DispatcherServlet的权限定类名"})

demo(案例)

预测结果:根据给注解的作用,可知 必须存在web的起步依赖才存在DispatcherServlet类,继而可以注入provice

<!--        web 的起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

CommonConfig 配置类

java">package com.it.heima.config;import cn.itcast.pojo.Country;
import cn.itcast.pojo.Province;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ComonConfig {//配置文件中,配置了指定信息,则注入,否则不注入@ConditionalOnProperty(prefix = "Country" ,name={"name","system"})@Beanpublic Country getCountry(@Value("${Country.name}") String name, @Value("${Country.system}") String system){Country country = new Country();country.setName(name);country.setSystem(system);return country;}// 如果 ioc 容器中不存在Country对象,则注入provice,否则不注入//@ConditionalOnMissingBean(Country.class)// 如果当前环境中,存在DispatcherServlet类,则注入provice,否则不注入// 如果当前引入了web起步依赖,则存在DispatcherServlet类,@ConditionalOnClass(name={"org.springframework.web.servlet.DispatcherServlet"})@Beanpublic Province getProvince() {return new Province();}
}

运行截图



http://www.ppmy.cn/ops/166057.html

相关文章

字符串函数和结构题内存对齐

图下为函数使用&#xff1a; #include <ctype.h>int main() {int ret isdigit(Q);printf("%d\n", ret);return 0; }int main() {printf("%c\n", toupper(a));printf("%c\n", tolower(A));return 0; }

ubuntu修改时区

方法 1&#xff1a;使用命令行修改时区 1. 查看当前时区 运行以下命令查看当前时区&#xff1a; bash 复制 timedatectl 输出示例&#xff1a; 复制 Local time: Wed 2023-10-25 12:34:56 UTC Universal time: Wed 2023-10-25 12:34:56 UTC RTC time: Wed 2023-10-25 1…

百度百科更新!树莓集团宜宾项目的深远影响与意义

百度百科对树莓集团宜宾项目的更新&#xff0c;让我们更清晰地认识到该项目的深远影响与意义。 从产业发展角度看&#xff0c;树莓集团宜宾项目带动了当地数字产业的蓬勃发展。通过建设产业园区&#xff0c;吸引了大量数字企业集聚&#xff0c;形成了完整的数字经济产业链。从…

PyTorch深度学习框架进阶学习计划 - 第21天:自然语言处理基础

PyTorch深度学习框架进阶学习计划 - 第21天 自然语言处理基础 今天我们将深入学习自然语言处理(NLP)的基础概念&#xff0c;重点关注词嵌入技术、序列建模原理以及主流模型之间的区别和优缺点。通过理解这些基础知识&#xff0c;你将能够更好地应用PyTorch构建NLP应用。 1. …

LLM对齐方法作用:主要解决大型语言模型(LLMs)输出与人类价值观、需求和安全规范不一致的问题

LLM对齐方法作用:主要解决大型语言模型(LLMs)输出与人类价值观、需求和安全规范不一致的问题 对齐方法(Alignment Methods) 主要解决大型语言模型(LLMs)输出与人类价值观、需求和安全规范不一致的问题。其核心目标是让模型生成的内容更符合人类预期,同时确保伦理合规性…

vue/react前端项目打包的时候加上时间,防止后端扯皮

在前端项目&#xff08;Vue/React&#xff09;打包时&#xff0c;将打包时间注入到项目中&#xff0c;可以有效防止前后端扯皮&#xff0c;尤其是在部署和调试时能够明确知道当前运行的代码版本和打包时间。以下是实现方案 在index.html中加入时间模板&#xff1a; <div s…

双 Token 无感刷新机制在前后端分离架构中实现

在前后端分离的架构中&#xff0c;双 Token 无感刷新是一种常见的身份验证机制&#xff0c;用于在 Access Token 过期时&#xff0c;通过 Refresh Token 自动获取新的 Access Token&#xff0c;从而避免用户频繁登录。 1. 双 Token 无感刷新的核心流程 1.1 核心流程 用户登录&…

大模型学习笔记------Llama 3模型架构之旋转编码(RoPE)

大模型学习笔记------Llama 3模型架构之旋转编码&#xff08;RoPE&#xff09; 1、位置编码简介1.1 绝对位置编码1.2 相对位置编码 2、旋转编码&#xff08;RoPE&#xff09;2.1 基本概念---旋转矩阵2.2 RoPE计算原理2.2.1 绝对位置编码2.2.2 相对位置编码 3、旋转编码&#xf…