Springboot中常见的@Import注解的三种使用方式详解

本文详细介绍了在SpringBoot 2.3.9.RELEASE中,如何通过三种不同的方式将类导入到SpringIOC容器中:直接导入普通数组、使用ImportSelector接口和ImportBeanDefinitionRegistrar接口。每种方式都有其特定的使用场景和注意事项,并提供了相应的测试用例来验证导入的正确性。

环境:springboot2.3.9.RELEASE


三种方法说明

  1. 直接导入普通数组的方式

  2. 导入ImportSelector类方式

  3. 导入ImportBeanDefinitionRegistrar方式

被导入的类加入到Spring IOC容器中。

直接导入普通数组的方式

public class A {
  @Bean
  public B b() {
    return new B() ;
  }
}
@Import({A.class})
@Configuration
public class ImportConfig {
}

这样A,B都被Spring IOC容器管理了。这里可以导入多个类。

注意:在Spring4.2之前的版本中被导入的类必须是配置类也就是类上有@Configuration注解,4.2后的版本随意一个普通类也可以。

测试:

@Resource
private A a ;
@Resource
private B b ;
	
@Test
public void testImport() {
  System.out.println("a = " + a) ;
  System.out.println("b = " + b) ;
}

 

导入ImportSelector类方式

通过实现ImportSelector接口

public class E {
  @Bean
  public G g() {
    return new G() ;
  }
}
public class F {
}
public class G {
}
@Import({C.class, A.class})
@Configuration
public class ImportConfig {
}
public class C implements ImportSelector {

  @Override
  public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    return new String[] {"com.pack.import_annotation.E", "com.pack.import_annotation.F"};
  }

}

这里的返回值中必须是完整的包名+类名

注意:这里可以返回空的String数组(length = 0),但是不能返回null。实现ImportSelector该接口的这个本身是不会被注册为Bean的。

测试:

@Resource
private E e ;
@Resource
private F f ;
@Resource
private G g ;
	
@Test
public void testImport() {
  System.out.println("e = " + e) ;
  System.out.println("f = " + f) ;
  System.out.println("g = " + g) ;
}

图片

 

导入ImportBeanDefinitionRegistrar方式

public class H implements ImportBeanDefinitionRegistrar {

  @Override
  public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    GenericBeanDefinition beanDefinition = new GenericBeanDefinition() ;
    beanDefinition.setBeanClass(X.class) ;
    beanDefinition.getPropertyValues().addPropertyValue("name", "张三") ;
    registry.registerBeanDefinition("x", beanDefinition) ;
	}

}
public class X {
	
  private String name ;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
	
}
@Import({C.class, A.class, H.class})
@Configuration
public class ImportConfig {
}

测试:

图片

 

注意:实现
ImportBeanDefinitionRegistrar该接口本身这个类是不会被注册为Bean的。

完毕!!!

给个关注+转发呗谢谢

 

Springboot基础使用@Conditional多条件注册Bean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值