Spring-@Import注解的三种方式给容器中导入组件

  1. 直接传入我们需要导入的Class对象
@Import(PowerBean.class)
@Configuration
public class ImportAppConfig {
}

使用这种方式Spring会给我们导入PowerBean这个BeanDefinition,并且beanDefinitionName为它的全类名。它使用的是无参数构造方法给容器中注册组件,并且beanDefinitionName为组件的全类名。

  1. 使用@Import(ImportSelector.class)的方式
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        String[] beans = {"com.wanna.bean.bean.PowerBean"};
        return beans;
    }
}

使用这种方式我们可以实现ImportSelector接口,重写electImports接口,返回一个字符串数组(放的是全类名),从而给容器中注册一些组件,注册的组件的beanDefinitionName就是组件的全类名

@Import(MyImportSelector.class)
@Configuration
public class ImportAppConfig {
}
  1. 使用@Import(ImportBeanDefinitionRegistrar.class)的方式

我们使用如下的方式去自定义我们自己的ImportBeanDefinitionRegistrar,并通过重写registerBeanDefinitions方法给我们容器中注入组件,通过BeanDefinitionRegistry来给容器中注册组件,在注册时可以指定beanDefinitionName

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition bd = new RootBeanDefinition();
        bd.setBeanClass(BookBean.class);
        registry.registerBeanDefinition("bookBean", bd);
    }
}

使用如下的方式导入我们自己的ImportBeanDefinitionRegistrar。

@Import(MyImportBeanDefinitionRegistrar.class)
@Configuration
public class ImportAppConfig {
}

我们就能将我们自己的BeanDefinition注册到容器中,这种方式在SpringAOP/SpringBoot中都在进行使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容