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