@
目录
1、@Import注解须知
2、@Import的三种用法
2.1、第一种用法:直接填class数组 2.2、第二种用法:ImportSelector方式【重点】 2.3、第三种用法:ImportBeanDefinitionRegistrar方式3、@Import注解的三种使用方式总结
1、@Import只能用在类上,@Import通过快速导入的方式实现把实例加入spring的IOC容器中
2、加入IOC容器的方式有很多种,@Import注解就相对很牛皮了,@Import注解可以用于导入第三方包,当然@Bean注解也可以,但是@Import注解快速导入的方式更加便捷
3、@Import注解有三种用法
@Import的三种用法主要包括:
1、直接填class数组方式
2、ImportSelector方式【重点】
3、ImportBeanDefinitionRegistrar方式 2.1、第一种用法:直接填class数组直接填对应的class数组,class数组可以有0到多个。
语法如下:
@Import({类名.class,类名.class...}) publicclassTestDemo{ }对应的import的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名,比如com.yc.类名
2.2、第二种用法:ImportSelector方式【重点】这种方式的前提就是一个类要实现ImportSelector接口,假如我要用这种方法,目标对象是Myclass这个类,分析具体如下:
创建Myclass类并实现ImportSelector接口
publicclassMyclassimplementsImportSelector{ //既然是接口肯定要实现这个接口的方法 @Override publicString[]selectImports(AnnotationMetadataannotationMetadata){ returnnewString[0]; } }分析实现接口的selectImports方法中的:
1、返回值:就是我们实际上要导入到容器中的组件全类名【重点】 2、参数:AnnotationMetadata表示当前被@Import注解给标注的所有注解信息【不是重点】需要注意的是selectImports方法可以返回空数组但是不能返回null,否则会报空指针异常!
以上分析完毕之后,具体用法步骤如下:
第一步:创建Myclass类并实现ImportSelector接口,这里用于演示就添加一个全类名给其返回值
publicclassMyclassimplementsImportSelector{ @Override publicString[]selectImports(AnnotationMetadataannotationMetadata){ returnnewString[]{"com.yc.Test.TestDemo3"}; } }第二步:编写TestDemo类,并标注上使用ImportSelector方式的Myclass类
@Import({TestDemo2.class,Myclass.class}) publicclassTestDemo{ @Bean publicAccountDao2accountDao2(){ returnnewAccountDao2(); } }可以看出,宜春故意挑了个龙套角色@Bean注解,若对@Bean注解不是很清晰的童鞋可以参考大白话讲解Spring的@bean注解
第三步:编写打印容器中的组件测试类
/** *打印容器中的组件测试 */ publicclassAnnotationTestDemo{ publicstaticvoidmain(String[]args){ AnnotationConfigApplicationContextapplicationContext=newAnnotationConfigApplicationContext(TestDemo.class);//这里的参数代表要做操作的类 String[]beanDefinitionNames=applicationContext.getBeanDefinitionNames(); for(Stringname:beanDefinitionNames){ System.out.println(name); } } }第四步:运行结果
2.3、第三种用法:ImportBeanDefinitionRegistrar方式同样是一个接口,类似于第二种ImportSelector用法,相似度80%,只不过这种用法比较自定义化注册,具体如下:
第一步:创建Myclass2类并实现ImportBeanDefinitionRegistrar接口
publicclassMyclass2implementsImportBeanDefinitionRegistrar{ //该实现方法默认为空 @Override publicvoidregisterBeanDefinitions(AnnotationMetadataannotationMetadata,BeanDefinitionRegistrybeanDefinitionRegistry){ } }参数分析:
第一个参数:annotationMetadata和之前的ImportSelector参数一样都是表示当前被@Import注解给标注的所有注解信息 第二个参数表示用于注册定义一个bean第二步:编写代码,自定义注册bean
publicclassMyclass2implementsImportBeanDefinitionRegistrar{ @Override publicvoidregisterBeanDefinitions(AnnotationMetadataannotationMetadata,BeanDefinitionRegistrybeanDefinitionRegistry){ //指定bean定义信息(包括bean的类型、作用域...) RootBeanDefinitionrootBeanDefinition=newRootBeanDefinition(TestDemo4.class); //注册一个bean指定bean名字(id) beanDefinitionRegistry.registerBeanDefinition("TestDemo4444",rootBeanDefinition); } }第三步:编写TestDemo类,并标注上使用ImportBeanDefinitionRegistrar方式的Myclass2类
@Import({TestDemo2.class,Myclass.class,Myclass2.class}) publicclassTestDemo{ @Bean publicAccountDao2accountDao222(){ returnnewAccountDao2(); } }第四步:运行结果
第一种用法:@Import({要导入的容器中的组件}):容器会自动注册这个组件,id默认是全类名
第二种用法:ImportSelector:返回需要导入的组件的全类名数组,springboot底层用的特别多【重点】
第三种用法:ImportBeanDefinitionRegistrar:手动注册bean到容器
以上三种用法方式皆可混合在一个@Import中使用,特别注意第一种和第二种都是以全类名的方式注册,而第三中可自定义方式。
@Import注解本身在springboot中用的很多,特别是其中的第二种用法ImportSelector方式在springboot中使用的特别多,尤其要掌握!
如果本文对你有一点点帮助,那么请点个赞呗,谢谢~
最后,若有不足或者不正之处,欢迎指正批评,感激不尽!如果有疑问欢迎留言,绝对第一时间回复!
欢迎各位关注我的公众号,里面有一些java学习资料和一大波java电子书籍,比如说周志明老师的深入java虚拟机、java编程思想、核心技术卷、大话设计模式、java并发编程实战.....都是java的圣经,不说了快上Tomcat车,咋们走!最主要的是一起探讨技术,向往技术,追求技术,说好了来了就是盆友喔...
本文内容总结:1、@Import注解须知,2、@Import的三种用法,3、@Import注解的三种使用方式总结,
原文链接:https://www.cnblogs.com/yichunguo/p/12122598.html