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方法;