Spring中模块装配的三种方式

@Import

可直接导入普通类、配置类、ImportSeletor 的实现类和 ImportBeanDefinitionRegistrar 的实现类,通常情况下是写在自定义注解上

编写 ImportSeletor 的实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface ImportSelector {

/**
* Select and return the names of which class(es) should be imported based on
* the {@link AnnotationMetadata} of the importing @{@link Configuration} class.
* @return the class names, or an empty array if none
*/
String[] selectImports(AnnotationMetadata importingClassMetadata);

@Nullable
default Predicate<String> getExclusionFilter() {
return null;
}
}

通过 selectImports 方法导入对象,返回的是一组需要导入的类的全限定类名

编写 ImportBeanDefinitionRegistrar 的实现类

1
2
3
4
5
6
7
8
9
10
11
12
public interface ImportBeanDefinitionRegistrar {


default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,
BeanNameGenerator importBeanNameGenerator) {

registerBeanDefinitions(importingClassMetadata, registry);
}

default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
}
}

直接通过 BeanDefinitionRegistry 的 registerBeanDefinition 方法注册 BeanDefinition 到容器中