博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot源码学习(十三) - Spring的ImportSelector原理你真的会了吗?
阅读量:4211 次
发布时间:2019-05-26

本文共 1308 字,大约阅读时间需要 4 分钟。

在之前的Spring的类级别注解学习中我们说过对于Import注解的解析,但是当时并没有对其进行详细解释。。今天就大概学习一下,这个Import注解还是挺有用的,像一些Enable注解都是通过Import实现的。

我们看到@SpringBootApplication这个注解就包含Import注解,那么我们看一下这个Import导入的类有什么特点。

我们发现标志2对应的接口都是我们比较熟悉的,均为bean实例化的时候首先调用的,而1对应的接口是什么,是否就是我们Improt导入类之后调的呐?我们逐步的跟踪,发现最终的接口为ImportSelector接口,也只有一个selectImports方法,其中入参就是我们之前分析的类和注解信息。

既然传入的是类的注解信息,那么是否就是说我们可以自定义一些东西?这里返回的String数组是什么,显然这里需要我们去看看别人是怎么做的以及调用这个方法之后都进行了哪些操作。

我们找到处理Import注解的类。通过分析,我们看到这里Import注解的递归的进行处理的。每一次递归就将扫描到的类全部处理Import处理。

那么我们就尝试自己写一个select吧!

1.定义一个实体类。

@Datapublic class Myselect {    private String name="123";    private String age="123123";}

2.定义配置类

@Configurationpublic class MySelectApp {    @Bean    public Myselect get(){        return new Myselect();    }}

3.定义selector接口实现工具类

对于多个import嵌套的情况就需要您根据@SpringBootApplication那样进行解析了。但项目应该还达不到那种级别。

public class Myselector implements ImportSelector {    @Override    public String[] selectImports(AnnotationMetadata importingClassMetadata) {        System.out.println("selector测试哦");        importingClassMetadata.getAnnotationTypes().forEach(System.out::println);        return new String[]{MySelectApp.class.getName()};    }}

4.定义Enable注解

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import({Myselector.class})public @interface EnableMyselect {}

5.开启注解并测试

转载地址:http://shkmi.baihongyu.com/

你可能感兴趣的文章
[图文] Seata AT 模式分布式事务源码分析
查看>>
__asm__ __volatile__("":::"memory"),内存屏障(memory barrier)
查看>>
添加系统调用的方法,2.6.35(没有测试)
查看>>
v4l2
查看>>
wubi的错
查看>>
Saving Data in SQL Databases
查看>>
textFields
查看>>
pm 源码分析
查看>>
Sending the User to Another App
查看>>
kmsg_dump
查看>>
Getting a Result from an Activity
查看>>
Allowing Other Apps to Start Your Activity
查看>>
dev/mem
查看>>
pfn_valid 源码分析
查看>>
dev/kmem 和dev/mem的区别
查看>>
checkbox
查看>>
Sending Simple Data to Other Apps
查看>>
Receiving Simple Data from Other Apps
查看>>
zswap
查看>>
AndroidVerifyBoot
查看>>