@Import与ImportSelector与ImportBeanDefinitionRegistar

@Import创建出来的组件,组件的名称为其全类名。这个注解可以用在将第三方的Bean注册到Spring Context。这种方式导入相对于Java Config来说更方便。

1
2
3

@Import({User.class, DBHelper.class})

@Import可以与ImportSelector结合使用。ImportSelector为一个接口,包含一个selectImports方法,该方法返回一个全类名数组,该数组代表的对象将会被注入到容器中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {

        // importingClassMetadata当前标注@Import注解类的所有注解信息
        return new String[]{
            "demo.xxx.XXX",
            "demo.xxx.YYY",
        };
    }
}

@Import可以与ImportBeanDefinitionRegistrar结合使用,实现ImportBeanDefinitionRegistrar接口,在registerBeanDefinitions方法中直接通过beanDefinitionRegistry完成Bean的注入。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,
                                        BeanDefinitionRegistry beanDefinitionRegistry) {
        /*
            beanDefinitionRegistry:BeanDefinition注册类,把所有需要注入到容器中的bean,调用
            beanDefinitionRegistry.registerBeanDefinition收工注册进来
         */
        if (beanDefinitionRegistry.containsBeanDefinition("red")) {
            beanDefinitionRegistry.registerBeanDefinition("red", new RootBeanDefinition(Weight.class));
        }
    }
}