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