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

环境: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) ;
}
Springboot中常见的@Import注解的三种使用方式详解

 

导入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) ;
}
Springboot中常见的@Import注解的三种使用方式详解

 

导入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 {
}

测试:

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

 

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

完毕!!!

公众号:Springboot实战案例锦集

 
posted @ 2021-07-15 09:51  FastCoder  阅读(400)  评论(0编辑  收藏  举报