• 【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
  • 相关阅读:
    浅聊||高速PCB过孔设计需要注意这些问题
    SpringSecurity(JWT、SecurityConfig、Redis)
    EasyRecovery软件最新版安装包V15版本数据恢复软件
    java使用world模板动态生成PDF文件
    十二,HDR环境贴图卷积
    springboot 老年人健康保障管理系统毕业设计源码302303
    24计算机考研调剂 | 太原科技大学
    BERT-as-service 时隔三年突然更新,这次连名儿都改了
    unittest自动测试多个用例时,logging模块重复打印解决
    神辅助 Cursor 编辑器,加入 GPT-4 让编码更轻松!
  • 原文地址:https://blog.csdn.net/qq_43783527/article/details/127716659