Springboot中常见的@Import注解的三种使用方式详解
环境:springboot2.3.9.RELEASE
三种方法说明
- 直接导入普通数组的方式
- 导入ImportSelector类方式
- 导入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实战案例锦集