spring boot 三:3.底层注解@Conditional条件装配

spring boot 三:3.底层注解@Conditional条件装配

1 介绍

条件装配:满足Conditional指定的条件,则进行组件注入

查看Conditional相关的各个注解:
在这里插入图片描述
常用条件装配相关注解如下所示:
在这里插入图片描述

2 使用

比如ConditionalOnBean或者ConditionalOnMissingBean,即存在这个bean的时候,和不存在这个bean的时候,在@Configuration配置类上方增加该注解时,即可灵活实现是否在配置类中的,配置这些组件的功能(比如用户类组件,需要班级类组件存在,才有用户类,那么用户类就可以增加上@ConditionalOnBean(name = “xxx”)),表示用户类组件存在的前提,是xxx这个bean存在。举个例子:

package com.xiaoxu.config;

import com.xiaoxu.domain.Fruit;
import com.xiaoxu.domain.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author xiaoxu
 * @date 2021-12-27
 * Ymybatis:com.xiaoxu.config.MyConfig
 */
@Import({User.class})
@Configuration(proxyBeanMethods = false)
@Conditional(value = {})
public class MyConfig {
//    @Bean(name = "fruit")
    @Bean(name = "myfruit",value = "myfruit")
    @ConditionalOnBean(name = "myuser")
    public Fruit getFruit() throws ParseException {
        Fruit fruit = new Fruit();
        fruit.setFname("桃子");
        fruit.setPrice(new BigDecimal("12.5"));
        fruit.setCount(120);
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(s.format(new Date()));
        String d = s.format(new Date());
        System.out.println(s.parse(d));
        fruit.setDropDate(s.parse(d));
        return fruit;
    }
    
    @Bean
    public User getUser(){
        User u=new User();
        u.setName("xiaoxu");
        u.setAge((byte)29);
        u.setMoney(new BigDecimal("10"));
        u.setId(1234);
        return u;
    }
}

myfruit组件存在的前提是getUser这个bean组件存在,所以在主程序类中可以找到,myfruit组件应该是不存在的,如下:

@SpringBootApplication(scanBasePackages = {"com.xiaoxu"})
public class MainApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        System.out.println("*******开始*********");
        boolean myfruit = run.containsBean("myfruit");
        System.out.println("是否存在组件myfruit:"+myfruit);
        boolean getuser = run.containsBean("getUser");
        System.out.println("是否存在组件myuser:"+getuser);
        System.out.println("*******结束*********");
    }
}
*******开始*********
是否存在组件myfruit:false
是否存在组件myuser:true
*******结束*********

上面的形式是加在某个组件的方法上,也可以将@Conditional相关的注解加在类上,效果就是,如果类中不存在或者存在某个bean、类等等时,类中的全部bean才生效,如下:

配置类修改如下:

@Import({User.class})
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(name = "myuser")
public class MyConfig {
//    @Bean(name = "fruit")
    @Bean(name = "myfruit",value = "myfruit")
//    @ConditionalOnBean(name = "myuser")
    public Fruit getFruit() throws ParseException {
        Fruit fruit = new Fruit();
        fruit.setFname("桃子");
        fruit.setPrice(new BigDecimal("12.5"));
        fruit.setCount(120);
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(s.format(new Date()));
        String d = s.format(new Date());
        System.out.println(s.parse(d));
        fruit.setDropDate(s.parse(d));
        return fruit;
    }

    @Bean
    public User getUser(){
        User u=new User();
        u.setName("xiaoxu");
        u.setAge((byte)29);
        u.setMoney(new BigDecimal("10"));
        u.setId(1234);
        return u;
    }
}

再次执行主程序类:

@SpringBootApplication(scanBasePackages = {"com.xiaoxu"})
public class MainApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        System.out.println("*******开始*********");
        boolean myfruit = run.containsBean("myfruit");
        System.out.println("是否存在组件myfruit:"+myfruit);
        boolean getuser = run.containsBean("getUser");
        System.out.println("是否存在组件myuser:"+getuser);
        System.out.println("*******结束*********");
    }
}
*******开始*********
是否存在组件myfruit:false
是否存在组件myuser:false
*******结束*********

很明显,除了该类,外面是不具有myuser这个组件的,所以均为false,即这个MyConfig类都不会创建各个bean对象,所以找不到。

若修改配置类条件装配为:@ConditionalOnMissingBean(name = “my”),如果外面不具备my这个组件,那么类中两个组件均能找到(这个类的bean会创建出来),如下:

*******开始*********
是否存在组件myfruit:true
是否存在组件myuser:true
*******结束*********
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值