• 【Spring注解】@Conditional注解的使用


    前言

    @Conditional注解的判断条件,决定了该类是否可以成为Bean。即使该类被@Component注解修饰,@Conditional条件是false,那么该类也不会注入到IOC容器中。且该注解在springboot项目中被大量使用

    使用场景

    1、在spring扫描文件注入IOC容器的过程中被使用;

    实战演练

    现在我们以案例的形式为大家演示如何使用@Conditional注解。

    1、搭建spring项目环境

    你需要有一套可运行的spring环境,在此我默认大家已经成功搭建了环境。
    【环境搭建】搭建Spring环境以及目录结构

    2、创建如下目录 及 类:

    在这里插入图片描述

    package org.example.condition;
    
    
    import org.springframework.context.annotation.Condition;
    import org.springframework.context.annotation.ConditionContext;
    import org.springframework.core.type.AnnotatedTypeMetadata;
    
    /**
     * author: cms
     * date: 2022/11/6 8:24 AM
     * description: 自定义一个spring的Condition功能。--springboot里面大量使用Condition功能。
     */
    public class UserCondition implements Condition {
    
        /**
         * 功能描述:如果程序中存在org.example.nonbeanservice.BookService则返回true,否则false
         *
         * @param context spring应用上下文
         * @param metadata 注解元信息
         * @return bool 条件是否通过
         */
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
    
            try {
                context.getClassLoader().loadClass("org.example.nonbeanservice.BookService");
                return true;
            } catch (Exception e) {
                return false;
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    3、添加条件注解@Conditional

    给UserService添加条件注解:@Conditional(UserCondition.class)
    在这里插入图片描述

    即使UserService被@Component注解修饰,也需要看@Conditional是否满足条件。如果不满足@Conditional条件,那么UserService也不会成为一个Bean。

    4、运行程序

    尝试改变@Conditional的bool条件,然后比较下面结果输出:

    package org.example;
    
    import org.example.beanservice.UserService;
    import org.example.config.AppConfig;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    import java.util.Arrays;
    
    /**
     * author: cms
     * date: ${DATE} ${TIME}
     * description: xxx
     */
    public class Main {
        public static void main(String[] args) {
            System.out.println("-------- Main  start ---------");
            // 1.获取容器对象
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
            // 获取容器中所有bean的名字
            String[] beanDefinitionNames = context.getBeanDefinitionNames();
            System.out.println(Arrays.toString(beanDefinitionNames));
            // 获取容器中所有bean的数量
            int beanDefinitionCount = context.getBeanDefinitionCount();
            System.out.println(beanDefinitionCount);
            // 获取容器中指定名称的bean实例
            UserService userService = (UserService) context.getBean("userService");
            userService.printName();
    
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
  • 相关阅读:
    GitHub Copilot 嘴动编码
    【好书推荐】JavaScript Es8 函数式编程实践入门
    单元测试系统化讲解之Mockito
    代码随想录算法训练营第三十六天| 435. 无重叠区间 763.划分字母区间 56. 合并区间
    【Spark】spark对mysql的操作
    java压缩图片几种方式及安装
    软件定义的云安全实践
    浅析Promise
    14_墨菲定律书摘
    剪切板中,经常用到的gpt编程提问
  • 原文地址:https://blog.csdn.net/qq_43783527/article/details/127716659