springboot之三:原理分析之自动配置condition

news2024/11/20 9:28:26

导入:

SpringBoot是如何知道要创建哪个Bean的?比如Spring Boot是如何知道要创建RedisTemplate的?

Condition:

Condition是在Spring4.0增加的条件判断功能,通过这个可以实现选择性的创建Bean操作。

  • 自定义条件:
        ① 定义条件类:自定义类实现Condition接口,重写 matches 方法,在 matches 方法中进行逻辑判断,返回 boolean值 。 matches 方法两个参数:
                • context:上下文对象,可以获取属性值,获取类加载器,获取BeanFactory等。
                • metadata:元数据对象,用于获取注解属性。
        ② 判断条件: 在初始化Bean时,使用 @Conditional ( 条件类 . class ) 注解
  • SpringBoot 提供的常用条件注解:
        • ConditionalOnProperty 判断配置文件中是否有对应属性和值才初始化Bean
        • ConditionalOnClass 判断环境中是否有对应字节码文件才初始化Bean
        • ConditionalOnMissingBean 判断环境中没有对应Bean才初始化Bean

创建模块:

需求一:

在Spring的IOC容器中有一个User的Bean,现要求:

导入Jedis坐标后,加载该Bean,没导入,则不加载。

新建domain软件包,User 类:

package com.itheima.springbootcondition.domain;

public class User {
}

新建config软件包,UserConfig 类:

package com.itheima.springbootcondition.config;


import com.itheima.springbootcondition.condition.ClassCondition;
import com.itheima.springbootcondition.domain.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UserConfig {
    @Bean
    @Conditional(ClassCondition.class)
    public User user(){
        return new User();
    }
}

新建condition软件包:ClassCondition类:

package com.itheima.springbootcondition.condition;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;


public class ClassCondition implements Condition {
    /**
     *
     * @param context  上下文对象。用于获取环境,ioc容器,classloader对象
     * @param metadata 注解元对象。用于获取注解定义的属性值。
     * @return
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

        //需求1: 导入Jedis坐标后,加载该Bean,没导入,则不加载。
        try {
            Class<?> cls = Class.forName("redis.clients.jedis.Jedis");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}

SpringbootConditionApplication类:

package com.itheima.springbootcondition;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;


@SpringBootApplication
public class SpringbootConditionApplication {
    public static void main(String[] args) {
        //启动springboot的应用,返回spring的ioc容器
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args);
        
        Object user = context.getBean("user");
        System.out.println(user);
    }

}

在pom文件里增删jedis坐标测试:

<dependency>
   <groupId>redis.clients</groupId>
   <artifactId>jedis</artifactId>
</dependency>

需求二:

在 Spring 的 IOC 容器中有一个 User 的 Bean,现要求:
将类的判断定义为动态的。判断哪个字节码文件存在可以动态指定。
在condition包下,新建注解ConditionOnClass :
package com.itheima.springbootcondition.condition;

import org.springframework.context.annotation.Conditional;

import java.lang.annotation.*;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ClassCondition.class)
public @interface ConditionOnClass {
    String[] value();
}

ClassCondition 类:

package com.itheima.springbootcondition.condition;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.util.Iterator;
import java.util.Map;

public class ClassCondition implements Condition {
    /**
     *
     * @param context  上下文对象。用于获取环境,ioc容器,classloader对象
     * @param metadata 注解元对象。用于获取注解定义的属性值。
     * @return
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {


        //需求2:导入通过注解属性值value指定坐标后创建bean

        //获取注解属性值 value
        Map<String, Object> map = metadata.getAnnotationAttributes(ConditionOnClass.class.getName());
//        System.out.println(map);
        String[] value = (String[]) map.get("value");
        try {
            for (String classname : value) {
                Class<?> cls = Class.forName(classname);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}

UserConfig 类:

package com.itheima.springbootcondition.config;


import com.itheima.springbootcondition.condition.ClassCondition;
import com.itheima.springbootcondition.condition.ConditionOnClass;
import com.itheima.springbootcondition.domain.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

@Configuration
public class UserConfig {
    @Bean
//    @Conditional(ClassCondition.class)
    @ConditionOnClass("redis.clients.jedis.Jedis")
    public User user(){
        return new User();
    }
}

在pom文件里增删jedis坐标测试。

整体项目结构:

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

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

相关文章

C++之string::npos应用实例(一百九十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

使用IDEA创建Vue3通过Vite实现工程化

1、创建Vite项目的分步说明 IntelliJ IDEA与Vite构建工具集成&#xff0c;改善了前端开发体验。Vite 由一个开发服务器和一个构建命令组成。构建服务器通过本机 ES 模块提供源文件。生成命令将代码与汇总捆绑在一起&#xff0c;汇总预配置为输出高度优化的静态资产以供生产。In…

AI绘画:Midjourney超详细教程Al表情包超简单制作,内附关键词和变现方式

大家好&#xff0c;本篇文章主要介绍AI绘画完成表情包的制作和变现方式分享。 你还不会AI表情包制作吗&#xff1f;下面我们详细的拆解制作过程。跟着这个教程做出一套属于自己的表情包。 核心工具Midjourney PS&#xff0c;你就可以得到一套自己的专属表情包啦~ 整体制作…

Go 基础15-在init()函数中检查包级变量的初始状态

从程序逻辑结构角度来看&#xff0c;包&#xff08;package&#xff09;是Go程序逻辑封装的基本单元&#xff0c;每个包都可以理解为一个“自治”的、封装良好的、对外部暴露有限接口的基本单元。一个Go程序就是由一组包组成的。 在Go包这一基本单元中分布着常量、包级变量、函…

胡焕庸线,我国东西地级市分布密度分界线

背景 黑河—腾冲线&#xff0c;又名胡焕庸线&#xff0c;是我国人口密度分布的东西近似分界线。今天把地级市坐标分布密度做成热力图&#xff0c;并与胡焕庸线一起展示时&#xff0c;惊奇的发现&#xff0c;胡焕庸线貌似也是我车东西地级市分布密度的分界线。 生成folium地图…

【17 > 分布式接口幂等性】2. Update的幂等性原理解析

一、 根据 唯一业务号去更新 数据的情况 1.1 原理 1.2 操作 1.3 实战 Stage 1&#xff1a;表添加 version 字段 Stage 2&#xff1a;前端 > 版本号放入隐藏域 Stage 3&#xff1a;后台 > 使用版本号作为更新条件 二、更新操作没有唯一业务号&#xff0c;可使用Tok…

FL Studio Producer Edition 21.0.3.3713中文完整破解版功能特点及安装激活教程

FL Studio Producer Edition 21.0.3.3713中文完整破解版是一款由Image Line公司研发几近完美的虚拟音乐工作站,同时也是知名的音乐制作软件。它让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混音盘&#xff0c;先进的创作工具&#xff0c;让你的音乐突破想象力的限制。…

4.2 Ioc容器加载过程-Bean的生命周期深度剖析

Bean生命周期详解 第一步拿到父类BeanFactory子类 第二步&#xff0c;读取配置类 AnnotatedBeanDefinitionReader 用来读取配置类之外和还做了 第一个是解析类的处理器&#xff0c;没有的话我们的配置类就无法解析 总结this()无参构造函数里面实现了【三大步】 实例…

九安监控初始化后恢复案例

九安监控是国内一个十六线小安防品牌&#xff0c;目前CHS零壹视频恢复程序监控版、专业版、高级版是支持这个安防品牌的&#xff0c;不过下边这个案例比较特殊&#xff0c;具体情况如下。 故障存储:希捷4T监控专用硬盘 故障现象: 客户描述是使用了初始化操作&#xff0c;正常…

Linux中防火墙的简单使用方法

目录 前言 一、概念 1、防火墙的分类&#xff1a; 2、防火墙性能 3、硬件防火墙的品牌、软件防火墙的品牌 4、硬件防火墙与软件防火墙比较 二、linux中的防火墙 1、iptables 2.netfilter/iptables功能 3、四表 iptables中表的优先级 4、五链 三、iptables 1、ipt…

YOLO DNF辅助教程完结

课程完结&#xff01;撒花、撒花、撒花 课程完结&#xff01;撒花、撒花、撒花 课程完结&#xff01;撒花、撒花、撒花 ​呕心沥血三个月&#xff0c;《利用人工智能做DNF游戏辅助》系列实战课程已完结&#xff0c;技术路线贯穿串口通信、目标检测、opencv特征匹配等前沿技术…

计算机组装与维护实训室解决方案

一、产业背景 随着信息技术的不断发展&#xff0c;信息化已经深入到社会中各个层面&#xff0c;它能有效地帮助各个行业提高运营及管理效率&#xff0c;进而帮助企业成长。同时&#xff0c;作为企业信息化建设的基础部分&#xff0c;计算机已经融入了我们的生活&#xff0c;并逐…

【算法】一文带你从浅至深入门dp动态规划

文章目录 一、前言二、动态规划理论基础1、基本概念2、动态规划五部曲【✔】3、出错了如何排查&#xff1f; 三、实战演练&#x1f5e1;0x00 斐波那契数0x01 第N个泰波那契数0x02 爬楼梯0x03 三步问题0x04 使用最小花费爬楼梯⭐解法一解法二 0x05 解码方法* 四、总结与提炼 一、…

查看Android App包名,查看keystore的信息,导出公钥

查看Android App包名的三种方法 cmd中输入命令&#xff1a;adb shell am monitor 然后启动需要获取包名的应用cmd中输入命令&#xff1a;adb shell pm list packages -3 查看自己安装的app包名安卓系统中&#xff1a;设置——应用——正在运行 查看…

SQLI-labs-第七关

知识点&#xff1a;单引号&#xff08;&#xff09;加括号闭合错误的布尔盲注 思路&#xff1a; 寻找注入点 我们首先看一下正常的回显&#xff0c;并没有显示出什么明显的信息 输入?id1 发现报错 输入?id1 -- 还是报错&#xff0c;说明SQL语句的语法错误可能不是单引号闭合…

微信/QQ/TIM防撤回补丁

适用于 Windows 下 PC 版微信/QQ/TIM的防撤回补丁。支持最新版微信/QQ/TIM&#xff0c;其中微信能够选择安装多开功能。 下载地址&#xff1a; ⚡️点我下载最新版本 相关文档&#xff1a; ✔支持哪些版本 | ❓常见问题 | &#x1f4d6;查看完整文档 原理与方法&#xff1a; …

视频怎么转成漫画?分享些视频转漫画方法

在现代社会中&#xff0c;视频和漫画都是非常流行的媒介形式。而有时候&#xff0c;我们可能想将一些有趣的视频转化为漫画&#xff0c;以便在社交媒体上分享或进行其他用途。这篇文章将介绍几种视频转漫画的方法和注意事项。 使用转换工具 现在手机上有很多好用的工具&#x…

根据站点经纬度画全球分布图python

已知几个站点的经纬度,要求画出在全球的分布。 import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import cartopy.crs as ccrs import cartopy.feature as cfeature from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter f…

Python练习分割字符串

str"itheima itcast boxuegu" # 统计字符串类有多少个“it”字符 count str.count("it") print(f"字符串类有{count}个“it”字符") # 将字符串内的空格全部替换为字符&#xff1a;“|” str_replace str.replace(" ", "|"…