spring注解学习之 九 DeferredImportSelector接口

DeferredImportSelector接口

DeferredImportSelector是ImportSelector注解的一种扩展注解。

其执行逻辑是,当实现DeferredImportSelector类重写了

public Class<? extends Group> getImportGroup()

方法时,则在此类被@Import注解导入时执行getImportGroup方法,如果没有实现getImportGroup方法,则执行

public String[] selectImports(AnnotationMetadata importingClassMetadata)

实现DeferredImportSelector接口的类

 

package com.personal.spring.selector;

import com.personal.spring.group.MyGroup;
import org.springframework.context.annotation.DeferredImportSelector;
import org.springframework.core.type.AnnotationMetadata;

import java.util.function.Predicate;

public class MyDeferredImportSelector implements DeferredImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{};
    }

    @Override
    public Predicate<String> getExclusionFilter() {
        return null;
    }

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

 

实现DeferredImportSelector.Group接口的类

package com.personal.spring.group;

import org.springframework.context.annotation.DeferredImportSelector;
import org.springframework.core.type.AnnotationMetadata;

import java.util.ArrayList;
import java.util.List;

public class MyGroup implements DeferredImportSelector.Group{
    private AnnotationMetadata annotationMetadata;
    @Override
    public void process(AnnotationMetadata metadata, DeferredImportSelector selector) {
        this.annotationMetadata=metadata;
    }

    @Override
    public Iterable<Entry> selectImports() {
        List<Entry> list=new ArrayList<>();
        list.add(new Entry(this.annotationMetadata,"com.personal.spring.bean.Person"));
        return list;
    }
}

 

 

配置类

@Configuration
@ComponentScan(value = "com.personal.spring.bean",useDefaultFilters = false
)
@Import({MyImportBeanDefinitionRegistrar.class, MyDeferredImportSelector.class})
public class SpringConfig {
}

 

主程序

package com.personal.spring.main;

import com.personal.spring.bean.Person;
import com.personal.spring.config.SpringConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);
        String[] beanDefinitionNames = context.getBeanDefinitionNames();

        Arrays.stream(beanDefinitionNames).forEach(x-> System.out.println(x));

        Person bean = context.getBean(Person.class);
        System.out.println(bean);

    }
}

运行结果

D:\programs\jdk8\bin\java.exe "-javaagent:D:\programs\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=51128:D:\programs\IntelliJ IDEA 2020.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\programs\jdk8\jre\lib\charsets.jar;D:\programs\jdk8\jre\lib\deploy.jar;D:\programs\jdk8\jre\lib\ext\access-bridge-64.jar;D:\programs\jdk8\jre\lib\ext\cldrdata.jar;D:\programs\jdk8\jre\lib\ext\dnsns.jar;D:\programs\jdk8\jre\lib\ext\jaccess.jar;D:\programs\jdk8\jre\lib\ext\jfxrt.jar;D:\programs\jdk8\jre\lib\ext\localedata.jar;D:\programs\jdk8\jre\lib\ext\nashorn.jar;D:\programs\jdk8\jre\lib\ext\sunec.jar;D:\programs\jdk8\jre\lib\ext\sunjce_provider.jar;D:\programs\jdk8\jre\lib\ext\sunmscapi.jar;D:\programs\jdk8\jre\lib\ext\sunpkcs11.jar;D:\programs\jdk8\jre\lib\ext\zipfs.jar;D:\programs\jdk8\jre\lib\javaws.jar;D:\programs\jdk8\jre\lib\jce.jar;D:\programs\jdk8\jre\lib\jfr.jar;D:\programs\jdk8\jre\lib\jfxswt.jar;D:\programs\jdk8\jre\lib\jsse.jar;D:\programs\jdk8\jre\lib\management-agent.jar;D:\programs\jdk8\jre\lib\plugin.jar;D:\programs\jdk8\jre\lib\resources.jar;D:\programs\jdk8\jre\lib\rt.jar;D:\workspace_idea\spring-pro\target\classes;C:\Users\caopeng\.m2\repository\org\springframework\spring-context\5.2.8.RELEASE\spring-context-5.2.8.RELEASE.jar;C:\Users\caopeng\.m2\repository\org\springframework\spring-aop\5.2.8.RELEASE\spring-aop-5.2.8.RELEASE.jar;C:\Users\caopeng\.m2\repository\org\springframework\spring-beans\5.2.8.RELEASE\spring-beans-5.2.8.RELEASE.jar;C:\Users\caopeng\.m2\repository\org\springframework\spring-core\5.2.8.RELEASE\spring-core-5.2.8.RELEASE.jar;C:\Users\caopeng\.m2\repository\org\springframework\spring-jcl\5.2.8.RELEASE\spring-jcl-5.2.8.RELEASE.jar;C:\Users\caopeng\.m2\repository\org\springframework\spring-expression\5.2.8.RELEASE\spring-expression-5.2.8.RELEASE.jar;C:\Users\caopeng\.m2\repository\org\projectlombok\lombok\1.18.20\lombok-1.18.20.jar com.personal.spring.main.Main
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
springConfig
rainBow
com.personal.spring.bean.Person
com.personal.spring.bean.Person@7bb58ca3

Process finished with exit code 0

 

posted @ 2021-09-17 21:57  阿瞒123  阅读(797)  评论(0编辑  收藏  举报