DeferrImportSelector类及ImportSelector接口

DeferrImportSelector实现类的作用:

spring boot主注解中引入了一个AutoConfigurationImportSelector类,作用是通过类的全限定名字符串来将其注入容器;实现的功能是加载第三方的配置类,也就是我们引入的SpingMvc、mybatis、redis等。

这个类继承了DeferrImportSelector类,属于ImportSelector接口的实现类;

DeferrImportSelector类大概结构:

public interface DeferredImportSelector extends ImportSelector {
    @Nullable
    default Class<? extends DeferredImportSelector.Group> getImportGroup() {
        return null;
    }
        ...
    public interface Group {
        ...
        Iterable<DeferredImportSelector.Group.Entry> selectImports();
        ...
    }
}

用法:

ImportSelector接口普通实现类的方式上一篇有写:ImportSelector接口注册bean_月亮鞋业的博客-CSDN博客

DeferrImportSelector类的使用方式:

1、写一个继承类MyDeferrImportSelector,重写该方法和接口,方法返回实现接口的类,接口里的方法返回包含实体类的迭代器(实体类等会注册为bean);

2、在MyDeferrImportSelector类里重写selectImports方法,跟接口里的一样;

3、找个自己写的配置类通过@Import注解将类注入容器;(不能直接用@Component注入的原因上一篇有写ImportSelector接口注册bean_月亮鞋业的博客-CSDN博客

最终就是这样,直接复制就能运行(记得做第三步操作将这个类注入):

public class MyDeferrImportSelector implements DeferredImportSelector {
    @Override
    public Class<? extends Group> getImportGroup() {
        return MyGroup.class;
    }

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.example.demo.beans.Teacher"};
    }

    @Override
    public Predicate<String> getExclusionFilter() {
        return null;//这个方法目前没用到
    }

    private static class MyGroup implements DeferredImportSelector.Group{

        AnnotationMetadata metadata;

        @Override
        public void process(AnnotationMetadata metadata,DeferredImportSelector selector){
            this.metadata = metadata;
        }

        @Override
        public Iterable<Entry> selectImports() {
            List<Entry> list = new ArrayList<>();
            list.add(new Entry(this.metadata,"com.example.demo.beans.User"));
            return list;
        }
    }
}

和其他 ImportSelector实现类的结构上的区别:

其他普通的实现类只有一个selectImports方法用于注册bean,如下:

public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.example.demo.beans.User"};
    }
}

而DeferrImportSelector类新增了内置Group接口,将这个方法移植到接口里;

并且DeferrImportSelector类可能会新增getImportGroup方法,这个方法作用是返回一个实现了Group接口的类;

和ImportSelector接口实现类使用上的区别:

ImportSelector接口普通实现类在初始化时,会直接调用selectImports方法将字符串数组里的实体类全部注入容器;

DeferrImportSelector类的继承类在初始化时,会先找有没有新增的那个getImportGroup方法,如果没有,直接调用类里的selectImports方法;

如果有,因为返回了内置接口实现类,所以调用的是接口里的selectImports方法;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值