@Import:是导入组件的一种注解,是选择性的注入。
- @Configuration
- public class MainConfig {
-
- // @Bean 注解默认可以不指定bean的名称,IOC实例化后的实例名称就是这个方法名
- @Bean("person")
- // @Bean
- public Person person() {
- return new Person("老大", "30");
- }
-
- }
- @Configuration
- //@Import(Dog.class)
- @Import({Dog.class, Cat.class})
- public class MainConfig {
-
- @Bean("person")
- public Person person() {
- return new Person("小二", "28");
- }
-
- }
- public class TestImportSelector implements ImportSelector {
- @Override
- public String[] selectImports(AnnotationMetadata annotationMetadata) {
- // 方法不要返回null
- return new String[]{"org.xiaobuisme.example.cap6.Fish", "org.xiaobuisme.example.cap6.Tiger"};
- }
- }
- @Configuration
- //@Import(Dog.class)
- //@Import({Dog.class, Cat.class})
- @Import({Dog.class, Cat.class, TestImportSelector.class})
- public class MainConfig {
-
- @Bean("person")
- public Person person() {
- return new Person("老3", "20");
- }
-
- }
- /**
- * ImportBeanDefinitionRegistrar:
- */
- public class TestImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
- /**
- * containsBeanDefinition(): 是否存在某个类的定义
- * registerBeanDefinition(): 注册实例bean
- *
- * @param annotationMetadata 注解类信息
- * @param registry bean注册器
- */
- @Override
- public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
- boolean beanDefinition1 = registry.containsBeanDefinition("org.xiaobuisme.example.cap6.Dog");
- boolean beanDefinition2 = registry.containsBeanDefinition("org.xiaobuisme.example.cap6.Cat");
-
- if (beanDefinition1 && beanDefinition2) {
- RootBeanDefinition beanDefinition = new RootBeanDefinition(Pig.class);
- registry.registerBeanDefinition("pig", beanDefinition);
- }
- }
- }
- @Configuration
- //@Import(Dog.class)
- //@Import({Dog.class, Cat.class})
- @Import({Dog.class, Cat.class, TestImportSelector.class, TestImportBeanDefinitionRegistrar.class})
- public class MainConfig {
-
- @Bean("person")
- public Person person() {
- return new Person("小4", "20");
- }
-
- }
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.annotation.AnnotationConfigApplicationContext;
- import org.xiaobuisme.example.cap6.MainConfig;
- import org.xiaobuisme.example.cap6.Fish;
- import org.xiaobuisme.example.cap6.Pig;
-
- public class Test {
- public static void main(String[] args) {
- ApplicationContext anno = new AnnotationConfigApplicationContext(MainConfig.class);
- String[] beanNames = anno.getBeanDefinitionNames();
- for (String beanName : beanNames) {
- System.out.println(beanName);
- }
-
- // 验证通过导入组件工具TestImportSelector导入的类实例是否存在
- Fish fish = anno.getBean(Fish.class);
- System.out.println(fish);
-
- // 验证通过ImportBeanDefinitionRegistrar 工具导入的类实例是否导入成功
- Pig pig = anno.getBean(Pig.class);
- System.out.println(pig);
- }
- }