@Import
可以写在任何一个组件,或者配置类上面
它其实是一个class的数组使用时,可以导入很多的组件
public @interface Import {
Class<?>[] value();
}
我现在我的配置类上用@Import导入两个组件
@Import({User.class, DBHelper.class}) //User是我自己写的一个组件,DBhelper是在第三方依赖里随便找的一个实体类。
@Configuration
public class MyConfig {
}
在主程序里获取容器里的组件并打印
public static void main(String[] args) {
//1.返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
//2. 查看容器里面的组件
String [] names=run.getBeanDefinitionNames();
for(String name : names)
{
System.out.println(name);
}
然后可以找到我导入的两个组件
**@Import({User.class, DBHelper.class}) **这个注解自动调用这两个类的无参构造器,给我们往容器里添加了组件,默认组件的名字是全类名
@Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
@Conditional是一个根注解,有很多派生注解
这里演示**@ConditionalOnBean和@ConditionalOnMissingBean**
比如我把我的配置类写成这个样子
@Configuration
public class MyConfig {
@Bean //先添加pet组件
public Pet pet(){
return new Pet("asd");
}
@Bean
@ConditionalOnBean(name = "pet") //若存在pet组件,则添加user组件
public User user(){
User kk=new User("zhangsan");
kk.setPet(new Pet("asd"));
return kk;
}
}
在主函数里测试一下
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
boolean pet = run.containsBean("pet");
System.out.println("pet组件是否存在"+pet);
boolean user = run.containsBean("user");
System.out.println("user组件是否存在"+user);
若写为@ConditionalOnMissingBean(name = “pet”)
则出现结果