我们可以通过实现ImportSelector接口引入多个 类全名然后 引入容器多个bean 示例如下:
package test;
import com.enjoy.cap6.MainConfig;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* FactoryBean 和 BeanFactorty 有什么区别?
*
* FactoryBean :可以把我们的JAVA实例通过FactoryBean注入到容器中
*
* BeanFactorty:从我们的容器中获取实例化后的bean
*
*/
public class MainTEwst6 {
@Test
public void sss(){
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for(String name :beanDefinitionNames){
System.out.println(name);
}
}
}
package com.enjoy.cap6;
import com.enjoy.cap1.Person;
import com.enjoy.cap5.LinCodition;
import com.enjoy.cap5.WinCodition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(value = {Dog.class,Cat.class,TTTTImportSelector.class})
public class MainConfig {
/**
* 1、@Bean 【导入第三方的类或包的组件】,比如Person为第三方的类,需要我们IOC使用时
* 2、包扫描+组件的标注注解(@ComponentScan:@Controller,@Service,@Repository,@Componet)一般针对自己写的类
* 3、@Import:【快速给容器导入一个组件】注意@Bean有点简单
* 1)@Import(要导入到容器中的组件):容器会自动注册这个组件,bean的id为全类名
* 2)ImportSelector:是一个接口,返回需要导入到容器的组件的全类名数组。
*
* 容器启动时初始化person的bean实例
*
* @return
*/
@Bean("person")
public Person zhangsan(){
System.out.println("给我们的容器中添加张三");
return new Person("张三",22);
}
}
package com.enjoy.cap6;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class TTTTImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.enjoy.cap6.Fish","com.enjoy.cap6.Tiger"};
}
}
package test;
import com.enjoy.cap6.MainConfig;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* FactoryBean 和 BeanFactorty 有什么区别?
*
* FactoryBean :可以把我们的JAVA实例通过FactoryBean注入到容器中
*
* BeanFactorty:从我们的容器中获取实例化后的bean
*
*/
public class MainTEwst6 {
@Test
public void sss(){
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for(String name :beanDefinitionNames){
System.out.println(name);
}
}
}
测试结果:
如果返回null的话会报错:
package com.enjoy.cap6;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class TTTTImportSelector implements ImportSelector {
/**
*
* @param importingClassMetadata
* @return
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return null;
}
}
报错如下:
我们debug进去看看
进入了 config解析器