@Conditional 注解按照条件给容器注入bean。
先来看看Conditional的源码,里面的属性是一个实现Condition接口的类的数组。也就是说,我们需要定义自己的Condition,在Condition中编写自己的条件。
再看一下Condition接口的源码,里面只有一个返回类型为boolean的matches()抽象方法,我们只需要实现这个方法就可以。当matches方法返回true时,Spring会将bean注入到IOC容器中,返回false,则不注入。
配置类代码如下,在person()方法上添加了Conditonal({MyConditional.class})。当MyConditional类中matches方法返回true时,Person类允许被注入。
MyConditonal类代码如下,通过conditionContext,取出当前系统类型,如果系统为Windows系列的操作系统,就返回true。
通过下面语句,输出IOC容器中所有的Bean
String[] beanDefinitionNames = atcApplicationContext.getBeanDefinitionNames();
for(String name:beanDefinitionNames){
System.out.println(name); }
运行结果:(当前操作系统为win10,所以person被注入到了IOC容器中)
需要注意的是,这里的@Conditional里只有一个Mycondition类,如果有多个条件类,需要同时都返回true,bean才会被注入。