1、@Import注解须知

1、@Import只能用在类上 ,@Import通过快速导入的方式实现把实例加入spring的IOC容器中

2、加入IOC容器的方式有很多种,@Import注解就相对很牛皮了,@Import注解可以用于导入第三方包 ,当然@Bean注解也可以,但是@Import注解快速导入的方式更加便捷

3、@Import注解有三种用法

2、@Import的三种用法

@Import的三种用法主要包括:

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

2.1、第一种用法:直接填class数组

直接填对应的class数组,class数组可以有0到多个。

语法如下:

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

对应的import的bean都将加入到spring容器中,这些在容器中bean名称是该类的全类名 ,比如com.yc.类名

2.2、第二种用法:ImportSelector方式【重点】

这种方式的前提就是一个类要实现ImportSelector接口,假如我要用这种方法,目标对象是Myclass这个类,分析具体如下:

创建Myclass类并实现ImportSelector接口

/** * @import 注解中使用ImportSelector * 自定义逻辑,返回需要导入的组件 */public class MySelector implements ImportSelector {    /**     * 返回值为需要导入到容器中的bean的全类名数组     * @param annotationMetadata     * @return     */    @Override    public String[] selectImports(AnnotationMetadata annotationMetadata) {        Map<String, Object> attributes = annotationMetadata.getAnnotationAttributes(MyScan.class.getName());        if (CollectionUtils.isEmpty(attributes)) {            return new String[0];        }        String[] basePackages = (String[]) attributes.get("basePackages");        ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);        scanner.addIncludeFilter(new AssignableTypeFilter(Student.class));//这里实现包含,相当@ComponentScan  includeFilters        scanner.addIncludeFilter(new AssignableTypeFilter(User.class));        //scanner.addExcludeFilter(new AssignableTypeFilter(Object.class));//这里可以实现排除,相当@ComponentScan  excludeFilters        Set<String> classs = new HashSet<>();        for (String basePackage : basePackages) {            Set<BeanDefinition> components = scanner.findCandidateComponents(basePackage);            components.forEach(bean -> classs.add(bean.getBeanClassName()));        }        return classs.toArray(new String[0]);    }}

分析实现接口的selectImports方法中的:

  • 1、返回值:就是我们实际上要导入到容器中的组件全类名【重点 】

  • 2、参数:AnnotationMetadata表示当前被@Import注解给标注的所有注解信息【不是重点】

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

以上分析完毕之后,具体用法步骤如下:

编写自定义注解,在启动类引入即可。

@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE})@Documented@Import(MySelector.class)public @interface MyScan {    @AliasFor("basePackages")    String[] value() default {};    @AliasFor("value")    String[] basePackages() default {};}

编写启动类打印组件测试类:

@MyScan(basePackages = {"com.kingoe.skill.entity"})@SpringBootApplicationpublic class SkillApplication {    public static void main(String[] args) {        ConfigurableApplicationContext context = SpringApplication.run(SkillApplication.class, args);        String[] beanDefinitionNames = context.getBeanDefinitionNames();        for (String name : beanDefinitionNames){            System.out.println(name);        }    }}

2.3、第三种用法:ImportBeanDefinitionRegistrar方式

同样是一个接口,类似于第二种ImportSelector用法,只不过这种用法比较自定义化注册,具体如下:

第一步:创建MyTest2类并实现ImportBeanDefinitionRegistrar接口

public class MyTest2 implements ImportBeanDefinitionRegistrar {
//该实现方法默认为空@Overridepublic void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Test4.class);beanDefinitionRegistry.registerBeanDefinition("TestDemo4444",rootBeanDefinition);    }
}

参数分析:

  • 第一个参数:annotationMetadata 和之前的ImportSelector参数一样都是表示当前被@Import注解给标注的所有注解信息

  • 第二个参数表示用于注册定义一个bean

第二步:编写TestDemo 类,并标注上使用ImportBeanDefinitionRegistrar方式的MyTest2类

@Import({MyTest2.class,Myclass2.class})
public class TestDemo {@Beanpublic AccountDao2 accountDao222(){return new AccountDao2();}}

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

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

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

第三种用法:ImportBeanDefinitionRegistrar:手动注册bean到容器

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

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

spring注解之@Import注解的三种使用方式相关推荐

  1. Spring 依赖注入的理解及三种注入方式

    Spring 依赖注入概念和三种注入方式(理解及应用) 什么是注入 要了解Spring的三种注入方式首先前提是得先了解一下什么是注入,相信很多人对这个概念都是模糊不清的,网上的解释是这样的: 依赖注入 ...

  2. java的 import注解_[java]一分钟学会spring注解之@Import注解

    今天主要从以下几方面来介绍一下@Import注解 @Import注解是什么 @Import的三种使用方式 1,@Import注解是什么 通过导入的方式实现把实例加入springIOC容器中 2,@Im ...

  3. Spring Bean的三种配置方式

    目录 一.传统的XML配置方式 二.基于java注解的配置 三.基于类的Java Config 正文 Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java C ...

  4. 【Spring杂烩】探讨Spring向容器注册Bean的三种方式

    探讨Spring向容器注册Bean的三种方式 重点了解@Import实现的三种子方式 前提概要 Spring向容器注册Bean的三种方式 通过@ComponentScan.@Componet 通过@B ...

  5. spring三种注入方式

    设置Spring的作用域 或者使用枚举值设置 单例和多里使用场景 自动注入 @Primary 一个接口有多个实现被spring管理吗,在依赖注入式,spring会不知道注入哪个实现类就会抛出NoUni ...

  6. spring入门之Spring 常用的三种注入方式

    Spring 常用的三种注入方式 Spring 通过 DI(依赖注入)实现 IOC(控制反转),常用的注入方式主要有三种:构造方法注入,set 方法注入,基于注解的注入. 一.通过构造方法注入 先简单 ...

  7. Spring Boot 启动执行某个方法的三种实现方式

    Spring Boot 启动执行某个方法的三种实现方式 Spring Boot 启动执行某个方法的三种实现方式 第一种方式 @PostConstruct 注解解释 具体实现 第二种方式 Applica ...

  8. Spring的三种注入方式(为什么推荐构造器注入?)

    Spring的三种注入方式 一.属性注入 @Resource和@Autowired的区别 为什么尽量使用 @Resource? 二.setter 注入 三.构造器注入 具体可以看看Spring官网 为 ...

  9. 扯一把 Spring 的三种注入方式,到底哪种注入方式最佳?

    循环依赖这个问题,按理说我们在日常的程序设计中应该避免,其实这个本来也是能够避免的.不过由于总总原因,我们可能还是会遇到一些循环依赖的问题,特别是在面试的过程中,面试考察循环依赖,主要是想考察候选人对 ...

最新文章

  1. ngModel 值不更新/显示
  2. gc的原因 频繁full_系统缓慢+CPU 100%+频繁Full GC问题的定位排查思路!
  3. 附加到SQL2012的数据库就不能再附加到低于SQL2012的数据库版本
  4. python3urllib中的quote与encode的区别_Python的urllib.quote()和urllib.unquote()的等效Javascript函数...
  5. AutoCAD.NET API 最新(2012)教程下载及在线视频教程DevTV
  6. android 滚动条 相关属性
  7. 【OpenCV】图像金字塔
  8. SQL Server同实例下不同数据库表的同步(job实现)
  9. 素数猜想对 c语言,1007 素数对猜想 (20 分)(C语言实现)
  10. c语言 程序设计 题库答案 p,c语言 程序设计 题库答案 p
  11. 研究生毕业论文查重标准是什么
  12. 数据库基础知识(1)--数据库php连接
  13. (学信网联合万方)免费论文查重
  14. 免费注册个体户营业执照出证教程
  15. 公司来了阿里人,然后......
  16. (转)DCB文件格式解析
  17. 弘辽科技:拼多多怎么提升访客量?有哪些方法?
  18. JAVA几种缓存技术介绍说明
  19. 爱盛科技于中国电子展演示穿戴式装置地磁传感器方案
  20. 根据小分子药物的名字找作用的靶点蛋白

热门文章

  1. apache 支持php urlmanager,Yii中urlManager的配置
  2. python defaultdict 类属性_Python collections.defaultdict模块用法详解
  3. DataTables—服务器端翻页
  4. 首届(2017)中国·呼和浩特创新创业创意大赛·华东分站赛在乌镇成功举办
  5. iOS 权限判断 跳转对应设置界面
  6. 俄罗斯调查PC厂商合谋操纵市场 联想被指妨碍调查
  7. ASP.NET登录控件login。
  8. 20150318知识小结
  9. 精通Windows Sockets 网络开发-基于Visual C++实现
  10. Windows Mobile 7(Photon) 梦幻之旅系列-前言