6.Conditional(条件装配:满足conditional指定的条件,则进行组件注入)
条件装配:满足Conditional指定的条件,则进行组件注入
使用@ConditionalOnBean作为示例进行示范,注意执行结果和@ConditionalOnBean的位置有很大关系
1.加到方法上
@Import({Person.class,Dog.class})
@Configuration
public class MyConfiguration {
//当容器中有这个name="getperson"的组件时,才执行下面的getperson组件注册放
@ConditionalOnBean(name = "getperson")
@Bean
public Person getperson(){
return new Person("吴孟达",18);
}
@Bean
public Dog getDog(){
return new Dog("刘丹",19);
}
}
测试代码:
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
System.out.println("启动springboot项目...");
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
System.out.println("启动成功!");
//根据perosn类型获取容器中的person组件的name数组
String[] beanNamesForType = run.getBeanNamesForType(Person.class);
for (String s : beanNamesForType) {
System.out.println("id:"+s);
}
}
}
输出:发现容器中只有cn.com.entity.Person这一个组件(通过@import注解注册的组件)
id:cn.com.entity.Person
2.注意:如果将@ConditionalOnBean(name = "getperson")改为@ConditionalOnBean(name = "cn.com.entity.Person")呢
即:
@Import({Person.class,Dog.class})
@Configuration
public class MyConfiguration {
//分析,此时方法上的@Import({Person.class,Dog.class})已经执行完毕,容器中已经有了cn.com.entity.Person组件,所以会执行下面的getperson方法
@ConditionalOnBean(name = "cn.com.entity.Person")
@Bean
public Person getperson(){
return new Person("吴孟达",18);
}
@Bean
public Dog getDog(){
return new Dog("刘丹",19);
}
}
测试输出:发现容器中注入了两个组件( 1.@Configuration和@Bean注册的组件 2.@import注册的组件)
id:cn.com.entity.Person
id:getperson
3.如果将@ConditionalOnBean加到类上时:
@Import({Person.class,Dog.class})
@Configuration
//这个意思是当容器中含有cn.com.entity.Person的bean时,下面的都会执行,但是此时容器中并没有,所以输出为空,没有person类型的组件
@ConditionalOnBean(name = "cn.com.entity.Person")
public class MyConfiguration {
@Bean
public Person getperson(){
return new Person("吴孟达",18);
}
@Bean
public Dog getDog(){
return new Dog("刘丹",19);
}
}