SpringBoot快速入门-@Import注解使用详解

@Import注解也是在SpringBoot中使用非常频繁的一个注解,还有相似功能的一系列注解:@ImportSelector、@DeffredImportSelector、@ConditionalOnBean、@ConditionalOnClass等等的众多导入功能的注解,实现了SpringBoot中的各种高级功能。

@Import注解的作用是快速导入某一个或多个类,使这些类能够被Spring加载到IOC容器中进行管理,使用在标注@Configuration注解的类上,使用@Import引入普通类,实现了ImportSelector接口或ImportBeanDefinitionRegistrar接口的实现类。
常用的三种使用方法:

1、@Import({ 类名1.class , 类名2.class… })
2、@Import({ ImportSelectorXXX1.class , ImportSelectorXXX2.class… })
3、@Import({ ImportBeanDefinitionRegistrarXXX1.class , ImportBeanDefinitionRegistrarXXX2.class… })

1、@Import直接引入类
格式:@Import({ 类名1.class , 类名2.class… })

/**
 * Import的使用
 */
@Import({Person2.class})
@Configuration
public class SpringBootConfiguration_4 {

}

2、ImportSelector自定义引入
1)自定义一个引入类,实现ImportSelector接口,并重写selectImports方法

public class ImportPerson3 implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{"com.itzhimei.handle.Person3"};
    }
}

这里返回的就是要加载到ioc的类,可以是一个或多个,指定的类要是类全限定类名,例如:”com.itzhimei.handle.Person3″}。

2)在配置类的@Import中引入自定义类

/**
 * ImportSelector的使用
 */
@Import({ImportPerson3.class})
@Configuration
public class SpringBootConfiguration_5 {

}

3、ImportBeanDefinitionRegistrar自定义注册bean
1)自定义一个引入类,实现ImportBeanDefinitionRegistrar接口,并重写registerBeanDefinitions方法

public class ImportPerson4Reg implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //指定bean定义信息(包括bean的类型、作用域...)
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Person4.class);
        //注册一个bean并指定bean的id
        registry.registerBeanDefinition("Person4",rootBeanDefinition);
    }
}

2)在配置类的@Import中引入自定义类

/**
 * ImportBeanDefinitionRegistrar的使用
 */
@Import({ImportPerson4Reg.class})
@Configuration
public class SpringBootConfiguration_6 {

}

我们从上面的例子可以看到使用ImportSelector和ImportBeanDefinitionRegistrar自定义的import,最后都需要使用@Import引入。
ImportSelector和ImportBeanDefinitionRegistrar在实际开发中的使用,比上面演示的会复杂一些,我们后续章节来介绍。