栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring中的ImportBeanDefinitionRegistrar接口对@Import注解的扩展

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring中的ImportBeanDefinitionRegistrar接口对@Import注解的扩展

在Spring中有importBeanDefinitionRegistrar接口,顾名思义,用于对@import注解引入的bean做扩展。该接口如下:

public interface importBeanDefinitionRegistrar {

	public void registerBeanDefinitions(
                            Annotationmetadata importingClassmetadata,
                            BeanDefinitionRegistry registry);

}

要理解该接口需要先理解@import注解,@import注解主要作用如下:

@Component
@import(Test2.class)
public class Test1 {
}
public class Test2{
}
@SpringBootApplication
public class SpringtestApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringtestApplication.class, args);
        System.out.println(context.getBean(Test2.class));
    }

}

此时Test2类虽然没有加@Component注解但也被注册为bean了,是因为在Test1中使用了@import注解将其引入。其实@import在Spring中是很有用的,例如各种@Enable...接口便用到了@import注解。

若要对@import注解引入的bean做更细粒度的定义便可以使用importBeanDefinitionRegistrar接口。如下:

@Component
@import(Test2.class)
public class Test1 {
}
public class Test4 {
    private String va;
    //setter...
}
public class Test2 implements importBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(Annotationmetadata importingClassmetadata, BeanDefinitionRegistry registry) {
        GenericBeanDefinition definition = new GenericBeanDefinition();
        definition.setBeanClass(Test4.class);
        definition.getPropertyValues().addPropertyValue("va","hello world");
        registry.registerBeanDefinition("tested4",definition);
    }
}
@SpringBootApplication
public class SpringtestApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringtestApplication.class, args);
        System.out.println(context.getBean(Test4.class));
    }

}

此时,在Test1上通过@import引入的Test2,然而Test2实现了importBeanDefinitionRegistrar接口,并且在registerBeanDefinitions方法中注册了Test4,所以Test4没有加@component注解也被注册为bean了。

!!!注意:此时Test2已经不是bean了,被替换为了Test4!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/446140.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号