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
*******结束*********