SpringBoot SpringBoot 原理篇 1 自动配置 1.12 bean 的加载控制【注解式】

news2025/7/21 0:40:36

SpringBoot

【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

SpringBoot 原理篇

文章目录

      • SpringBoot
      • SpringBoot 原理篇
      • 1 自动配置
        • 1.12 bean 的加载控制【注解式】
          • 1.12.1 问题引入
          • 1.12.2 bean的加载控制【注解式】
          • 1.12.3 小结

1 自动配置

1.12 bean 的加载控制【注解式】

1.12.1 问题引入

前面我们通过硬编码的形式完成了根据需求来控制某个bean 的加载,

在这里插入图片描述

但是这样就很容易想到问题,这样子代码量就太大了,而且每出现一种情况,就要整一个if 判断

而且还会出现,判断语句压根儿写不出来的情况

【有简单点儿的办法吗?当然】

1.12.2 bean的加载控制【注解式】

使用@Conditional注解的派生注解设置各种组合条件控制bean的加载

直接开干

先把原先的做法注掉

在这里插入图片描述

现在在配置中通过@Bean 注解主动加载一个bean

package com.dingjiaxiong.config;

import com.dingjiaxiong.bean.Cat;
import com.dingjiaxiong.bean.MyImportSelector;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;

/**
 * ClassName: SpringConfig
 * date: 2022/10/25 10:34
 *
 * @author DingJiaxiong
 */

public class SpringConfig {
    
    @Bean
    public Cat tom(){
        return new Cat();
    }
    
}

直接运行

在这里插入图片描述

现在来控制它

先换下坐标

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.7.4</version>
</dependency>

在这里插入图片描述

package com.dingjiaxiong.config;

import com.dingjiaxiong.bean.Cat;
import com.dingjiaxiong.bean.Mouse;
import com.dingjiaxiong.bean.MyImportSelector;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Import;

/**
 * ClassName: SpringConfig
 * date: 2022/10/25 10:34
 *
 * @author DingJiaxiong
 */

public class SpringConfig {

    @Bean
    @ConditionalOnClass(Mouse.class) //现在的意思就是只要发现了有老鼠,就创建猫
    public Cat tom(){
        return new Cat();
    }

}

直接运行

在这里插入图片描述

没毛病

如果我现在想换成狼,就不能用这种形式了,因为我们压根儿没有这个类

在这里插入图片描述

换个注解

package com.dingjiaxiong.config;

import com.dingjiaxiong.bean.Cat;
import com.dingjiaxiong.bean.Mouse;
import com.dingjiaxiong.bean.MyImportSelector;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Import;

/**
 * ClassName: SpringConfig
 * date: 2022/10/25 10:34
 *
 * @author DingJiaxiong
 */

public class SpringConfig {

    @Bean
//    @ConditionalOnClass(Wolf.class)
    @ConditionalOnMissingClass("com.dingjiaxiong.bean.Wolf")
    public Cat tom(){
        return new Cat();
    }

}

现在的意思就是如果我没有加载到Wolf,那我就加载猫

直接运行

在这里插入图片描述

OK,因为压根儿没有Wolf,所以Cat 可以被加载

如果改成Mouse

在这里插入图片描述

其实之前那个注解也可以,毕竟都能直接导入类了,那还有啥判断的必要?

在这里插入图片描述

改成Wolf

在这里插入图片描述

OK,没毛病

这是通过类,还可以根据容器中是否有bean 来进行判断

package com.dingjiaxiong.config;

import com.dingjiaxiong.bean.Cat;
import com.dingjiaxiong.bean.Mouse;
import com.dingjiaxiong.bean.MyImportSelector;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Import;

/**
 * ClassName: SpringConfig
 * date: 2022/10/25 10:34
 *
 * @author DingJiaxiong
 */

@Import(Mouse.class)
public class SpringConfig {

    @Bean
//    @ConditionalOnClass(name = "com.dingjiaxiong.bean.Wolf")
    @ConditionalOnBean(name = "com.dingjiaxiong.bean.Mouse")
    public Cat tom(){
        return new Cat();
    }

}

直接运行

在这里插入图片描述

有老鼠,有猫

如果tom 只想“等” Jerry

package com.dingjiaxiong.config;

import com.dingjiaxiong.bean.Cat;
import com.dingjiaxiong.bean.Mouse;
import com.dingjiaxiong.bean.MyImportSelector;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Import;

/**
 * ClassName: SpringConfig
 * date: 2022/10/25 10:34
 *
 * @author DingJiaxiong
 */

@Import(Mouse.class)
public class SpringConfig {

    @Bean
    @ConditionalOnBean(name = "jerry")
    public Cat tom(){
        return new Cat();
    }

}

运行

在这里插入图片描述

如果给Mouse 加上名

在这里插入图片描述

现在的老鼠是Jerry 了,tom 就出来了

再来个场景,就算Jerry 在了,但是如果狗在,tom 还是不出来

package com.dingjiaxiong.config;

import com.dingjiaxiong.bean.Cat;
import com.dingjiaxiong.bean.Mouse;
import com.dingjiaxiong.bean.MyImportSelector;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Import;

/**
 * ClassName: SpringConfig
 * date: 2022/10/25 10:34
 *
 * @author DingJiaxiong
 */

@Import(Mouse.class)
public class SpringConfig {

    @Bean
    @ConditionalOnBean(name = "jerry")
    @ConditionalOnMissingClass("com.dingjiaxiong.bean.Dog")
    public Cat tom(){
        return new Cat();
    }

}

运行结果

在这里插入图片描述

OK,有狗,tom 不会出来

当然其实还有特别多可以进行判定的注解

在这里插入图片描述

试试判断非web 项目

在这里插入图片描述

当然现在的配置都是写在配置类中使用@bean 注解

以后不一定要用这种格式

package com.dingjiaxiong.bean;

import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication;
import org.springframework.stereotype.Component;

/**
 * ClassName: Cat
 * date: 2022/10/25 10:32
 *
 * @author DingJiaxiong
 */

@Component("tom")
@ConditionalOnNotWebApplication
@ConditionalOnBean(name = "jerry")
public class Cat {
}

直接在类上也可以

配置类上扫一下

在这里插入图片描述

运行看看

在这里插入图片描述

有Jerry、非web,条件都满足,tom 就出现了

OK,回顾一下

匹配指定类

在这里插入图片描述

未匹配指定类

在这里插入图片描述

匹配指定类型的bean

在这里插入图片描述

匹配指定名称的bean

在这里插入图片描述

匹配指定名称的bean

在这里插入图片描述

匹配指定环境

在这里插入图片描述

所以这个东西有什么用?

举个栗子,假如我现在要用数据库,

先导入一个坐标

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.11</version>
</dependency>

在这里插入图片描述

【以往的写法】

@Bean
public DruidDataSource dataSource(){
    return new DruidDataSource();
}

运行

在这里插入图片描述

没啥问题,已经上来了

假如我现在不用数据库, 这个东西就没必要加载了

现在就可以整一个判定

@Bean
@ConditionalOnClass(name = "com.mysql.jdbc.Driver")
public DruidDataSource dataSource(){
    return new DruidDataSource();
}

运行结果

在这里插入图片描述

这样就不会加载了

如果我们现在又加上MySQL 的驱动

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>

在这里插入图片描述

再次运行

在这里插入图片描述

就是这样

匹配指定环境

在这里插入图片描述

1.12.3 小结
  1. 使用@ConditionalOn***注解为bean的加载设置条件

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

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

相关文章

【JVM技术专题】「原理专题」全流程分析Java对象的创建过程及内存布局

前言概要 对应过程则是&#xff1a;对象创建、对象内存布局、对象访问定位的三个过程。 对象的创建过程 对象的创建方式 java中对象的创建方式有很多种&#xff0c;常见的是通过new关键字和反射这两种方式来创建。除此之外&#xff0c;还有clone、反序列化等方式创建。 通过n…

CSS @property,让不可能变可能

本文主要讲讲 CSS 非常新的一个特性&#xff0c;CSS property&#xff0c;它的出现&#xff0c;极大的增强的 CSS 的能力&#xff01; 根据 MDN -- CSS Property&#xff0c;property CSS at-rule 是 CSS Houdini API 的一部分, 它允许开发者显式地定义他们的 CSS 自定义属性&…

vue项目分环境配置打包处理

vue项目分环境配置打包处理 目录 vue项目分环境配置打包处理 本地环境配置 生产环境配置 打包处理 打包配置处理&#xff08;扩展&#xff09; 本地环境配置 定义需要的变量&#xff0c;这里定义了各种变量标识&#xff0c;可参考使用&#xff0c;自定义项目需要的变量&…

设计问卷调查有哪些技巧?

调查问卷可以很好地帮助我们进行市场调研&#xff0c;所以想要做出一份有效的调查问卷&#xff0c;首先要确定问卷的主题。明确的主题就是定基调&#xff0c;可以让我们的后续过程更加顺利。然后我们再开始进行题目的设置和问卷的设计等动作。不过&#xff0c;在问卷设计的过程…

【js】【爬虫】fetch + sessionStorage 快速搭建爬虫环境及各种踩坑

文章目录导读需求开发环境fetch介绍为什么选择fetchfetch的封装使用数据存储数据访问封装多页面处理方案数据过大&#xff0c;拆分处理参考资料导读 需求 一说爬虫&#xff0c;很多人都会向导python&#xff0c;不过&#xff0c;真正省心的方案&#xff0c;应当是通过js控制获…

Reactive源码分析

Reactive用来绑定引用数据类型, 例如对象和数组等,实现响应式。 Reactive API 接口 export function reactive<T extends object>(target: T): UnwrapNestedRefs<T>相关API包括readonly、createReactiveObject、shallowReadonly、isReactive、toReactive。源码运…

Eureka注册中心

文章目录一、认识服务提供者和服务调用者二、Eureka 的工作流程三、服务调用出现的问题及解决方法四、搭建 eureka-server五、注册 user-service、order-service六、在 order-service 完成服务拉取&#xff08;order 模块能访问 user 模块&#xff09;七、配置远程服务调用八、…

从入门到进阶!当下火爆的大数据技术及算法怎么还能不知道 一起来学习互联网巨头的大数据架构实践!

大数据被称为新时代的黄金和石油&#xff0c;相关技术发展迅猛,所应用的行业也非常广泛&#xff0c;从传统行业如医疗、教育、金融、旅游&#xff0c;到新兴产业如电商、计算广告、可穿戴设备、机器人等。大数据技术更是国家科技发展和智慧城市建设的基础。 当前“互联网”新业…

骨传导耳机是怎么传声的?骨传导耳机会伤害耳朵吗?

作为一个耳机发烧友&#xff0c;平时最喜欢的就是捣鼓耳机。这几年入手了几十款耳机&#xff0c;头戴式、入耳式、半入耳、有线无线都会接触一些来玩&#xff0c;其中还有骨传导耳机这个相对小众的款类。 说到骨传导耳机&#xff0c;我应该算是最早一批的用户了&#xff0c;很…

web网页设计—— 指环王:护戒使者(13页) 电影网页设计 在线电影制作 个人设计web前端大作业

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

数据结构-ArrayList解析和实现代码

arrayList结构的实现是数组结构&#xff0c;数组没有扩容机制&#xff0c;arrayList的扩容机制采用的是复制数组&#xff0c;了解你会发现ArrayList虽然实现比较简单&#xff0c;但是设计还是很巧妙的。咱们先来简单实现下.. 咱们看下定义的全局变量 1.默认初始化空间为10&am…

docker 安装 Jenkins

一、Jenkins 安装 增加挂载目录和权限 # 增加挂载目录和权限mkdir /workspace/jenkins_homechown -R 1000:1000 /workspace/jenkins_home/创建容器 docker run --name jenkins -d \ -p 9999:8080 \ -p 8888:8888 \ -p 50000:50000 \ -v /workspace/jenkins_home:/var/jenkins…

[附源码]java毕业设计智慧教室预约

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

java检验mp4文件完整性的一个方法:使用ffmpeg

问题引入 最近笔者在写一个多线程下载视频文件的程序&#xff0c;打算让这个程序在我的空闲服务器上运行&#xff0c;但是几轮测试之后发现&#xff0c;有时候会存在下载的视频文件不完整的情况&#xff0c;这就导致了有些文件无法正常播放 问题排查 经过一周的排查后&#…

小白学流程引擎-FLowable(一) —FLowable是什么

小白学流程引擎-FLowable(一) | FLowable是什么 一、什么是流程引擎&#xff1f; 通俗的说&#xff0c;流程引擎就是多种业务对象在一起合作完成某件事情的步骤&#xff0c;把步骤变成计算机能理解的形式就是流程引擎。 流程引擎&#xff0c;用来驱动业务按照设定的固定流程…

《Kafka 源码实战》看完面试不慌!

Kafka 一开始是 LinkedIn 公司开发的消息队列&#xff0c;随着 Kafka 代码被贡献给 Apache 软件基金会后&#xff0c;就成功孵化成 Apache 顶级项目&#xff0c;世界上有越来越多的公司和个人开始使用 Kafka&#xff0c;所以 Kafka 使用的范围是很普遍的。 同时&#xff0c;值得…

vue实现文件上传压缩优化处理

vue js实现文件上传压缩优化处理 两种方法 &#xff1a; 第1种是借助canvas的封装的文件压缩上传第2种&#xff08;扩展方法&#xff09;使用compressorjs第三方插件实现 目录 vue js实现文件上传压缩优化处理 借助canvas的封装的文件压缩上传 1.新建imgUpload.js 2.全局引…

grafana变量使用

注&#xff1a;基于Grafana v8.3.6编写 1 添加变量 在dashboard界面点击setting&#xff0c;就能进入设置页面&#xff0c; 再点击Variables tab&#xff0c;就可以添加变量 比如我们添加一个系统架构的变量&#xff0c;用于区分Linux和Windows系统&#xff0c;通过node_una…

这可能是2022年把微服务讲的最全了:SpringBoot+Cloud+Docker

前言 最近几年&#xff0c;微服务可谓是大行其道。在业务模型不完善&#xff0c;超大规模流量的冲击的情况下&#xff0c;许多企业纷纷抛弃了传统的单体架构&#xff0c;拥抱微服务。这种模式具备独立开发、独立部署、可扩展性、可重用性的优点的同时&#xff0c;也带来这样一…

【云原生】K8S master节点更换IP以及master高可用故障模拟测试

文章目录一、前言二、配置 多个master 节点1&#xff09;节点信息1&#xff09;安装docker或containerd2&#xff09;安装kubeadm&#xff0c;kubelet和kubectl1、配置k8s yum源2、修改sandbox_image 镜像源3、配置containerd cgroup 驱动程序systemd4、开始安装kubeadm&#x…