05 sping注解开发-@Import

1 引入

增加一个study.wyy.spring.anno.other.config.OtherConfig配置类

@Configuration
public class OtherConfig {

    @Bean
    public Person other(){
        return new Person("other", 15);
    }
}

注意我们的主配置类:没有扫到这个study.wyy.spring.anno.other.config包路径

@Configuration
@ComponentScan(value = {"study.wyy.spring.anno.learn"})
public class MainConfig {

我们容器中是不会有OtherConfigother

测试:

  @Test(expected= NoSuchBeanDefinitionException.class)
    public void testOtherPerson() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        Person other = (Person) applicationContext.getBean("other");
        OtherConfig bean = applicationContext.getBean(OtherConfig.class);
    }

    @Test(expected= NoSuchBeanDefinitionException.class)
    public void testOtherConfig() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        OtherConfig bean = applicationContext.getBean(OtherConfig.class);
    }

2 @Import

2.1 入门案例

如何导入这个OtherConfig这个配置类呢?—> 使用@Import注解导入即可

  1. 在MainConfig使用@Import注解导入即可
 */
@Configuration
@ComponentScan(value = {"study.wyy.spring.anno.learn"})
@Import(OtherConfig.class)
public class MainConfig {
  1. 测试
   @Test
    public void testImportOtherPerson() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        Person other = (Person) applicationContext.getBean("other");
        OtherConfig bean = applicationContext.getBean(OtherConfig.class);
    }

    @Test
    public void testImportOtherConfig() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        OtherConfig bean = applicationContext.getBean(OtherConfig.class);
    }

2.2 @Import介绍

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {

	/**
	 * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
	 * or regular component classes to import.
	 */
	Class<?>[] value();

}
  • 使用在类上
  • 可以导入Configuration,ImportSelector,ImportBeanDefinitionRegistrar

刚刚演示的就是导入了一个配置类,将other这个Person导入

2.3 导入一个ImportSelector

2.3.1 ImportSelector介绍
public interface ImportSelector {

	/**
	 * Select and return the names of which class(es) should be imported based on
	 * the {@link AnnotationMetadata} of the importing @{@link Configuration} class.
	 */
	String[] selectImports(AnnotationMetadata importingClassMetadata);

}
  • 返回值:返回需要到导入组件的全类名数组
  • importingClassMetadata:当前类(在谁的类上时候导入ImportSelector)的注解信息
  • 注意返回值不要是null,可以返回一个空数组
2.3.2 使用案例

使用ImportSelector导入OtherConfig

  1. 实现Importector接口,导入OtherConfig
public class MyImportSelector implements ImportSelector {

    /**
     *
     * @param importingClassMetadata 类的注解信息
     * @return 返回需要到导入组件的全类名数组
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // 返回OtherConfig的全类名
       return new String[]{"study.wyy.spring.anno.other.config.OtherConfig"};
    }

}
  1. 在主配置类导入MyImportSelector
@Configuration
@ComponentScan(value = {"study.wyy.spring.anno.learn"})
@Import(MyImportSelector.class)
public class MainConfig {
  1. 在执行刚刚的测试方法进行断言

2.4 导入一个ImportBeanDefinitionRegistrar

2.4.1 ImportBeanDefinitionRegistrar介绍

通过registerBeanDefinitions方法,将需要添加到容器的组件手工注册进来

public interface ImportBeanDefinitionRegistrar {

	/**
	 * Register bean definitions as necessary based on the given annotation metadata of
	 * the importing {@code @Configuration} class.
	 * <p>Note that {@link BeanDefinitionRegistryPostProcessor} types may <em>not</em> be
	 * registered here, due to lifecycle constraints related to {@code @Configuration}
	 * class processing.
	 * @param importingClassMetadata annotation metadata of the importing class
	 * @param registry current bean definition registry
	 */
	public void registerBeanDefinitions(
			AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);

}
  • importingClassMetadata: 当前类的注解信息
  • registry: bean定义的注册类
2.4.2 演示案例
  1. 实现ImportBeanDefinitionRegistrar接口
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {


    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        BeanDefinition otherConfig = new RootBeanDefinition(OtherConfig.class);
        registry.registerBeanDefinition("otherConfig", otherConfig);
    }
}

  1. 在主配置中导入
@Configuration
@ComponentScan(value = {"study.wyy.spring.anno.learn"})
@Import(value = MyImportBeanDefinitionRegistrar.class)
public class MainConfig {
  1. 在执行刚刚的测试方法进行断言
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值