spring注解之@Import注解的三种使用方式

加入IOC容器的方式有很多种,其中@Import注解通过快速导入的方式实现把bean实例加入spring的IOC容器中,@Import注解可以用于导入第三方包 ,当然@Bean注解也可以,但是@Import注解快速导入的方式更加便捷,@Import的三种用法:

  1. 直接填class数组方式
  2. ImportSelector方式【重点】
  3. ImportBeanDefinitionRegistrar方式 

注意:@Import只能用在类类、接口、注解上

1.@Import直接填加class数组 

直接填加对应的class数组,class数组可以有0到多个,使用方式如下:    

@Import({类名.class , 类名.class...})
public class ImportDemo {

}

@Import注解添加的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名

2.ImportSelector方式

ImportSelector方式的前提就是一个添加的类要实现ImportSelector接口,例如:Myclass这个类,分析具体如下:

创建Myclass类并实现ImportSelector接口

@Import(Myclass.class)
public class MyTest {
}

public class Myclass implements ImportSelector {
    // 既然是接口肯定要实现这个接口的方法
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{TestDemo.class.getName()};
    }
}

分析实现接口的selectImports方法,其中

  • 参数: AnnotationMetadata表示当前被@Import注解给标注的所有注解信息,如@EnableAutoConfiguration->@Import(AutoConfigurationImportSelector.class)
  • 返回值: 就是我们实际上要导入到容器中的组件全类名,如:return new String[]{TestDemo.class.getName()};

注意:selectImports方法可以返回空数组但是不能返回null,否则会报空指针异常! 

3.ImportBeanDefinitionRegistrar方式

ImportBeanDefinitionRegistrar接口类似于第二种ImportSelector用法,只不过多了自定义注册的功能。

@Import(Myclass2.class)
public class MyTest2 {
}

public class Myclass2 implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
        // 指定bean定义信息(包括bean的类型、作用域...)
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestDemo.class);
        // 注册一个bean指定bean名字(id)
        beanDefinitionRegistry.registerBeanDefinition("testDemo",rootBeanDefinition);
    }
}

registerBeanDefinitions参数分析:

  • 第一个参数:AnnotationMetadata和之前的ImportSelector参数一样都是表示当前被@Import注解给标注的所有注解信息
  • 第二个参数:BeanDefinitionRegistry表示bean定义注册器,可用于注册定义一个bean

4、@Import注解的三种使用方式总结

第一种用法:@Import({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名

第二种用法:ImportSelector:返回需要导入的组件的全类名数组,springboot底层用的特别多【重点 】,例如@EnableAutoConfiguration

第三种用法:ImportBeanDefinitionRegistrar:手动注册bean到容器,例如@MapperScan

以上三种用法方式皆可混合在一个@Import中使用,特别注意第一种和第二种都是以全类名的方式注册,而第三中可自定义方式。

@Import注解本身在springboot中用的很多,特别是其中的第二种用法ImportSelector方式在springboot中使用的特别多,尤其要掌握!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值