视频地址: https://www.bilibili.com/video/BV1yr4y1w7ia
代码仓库: https://gitee.com/crazyliyang/video-teaching
直接上代码说明: 建立项目 spring-import-selector
核心 MyEnableAutoImportBeans
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
@Import(value = {
Dog.class, // 直接 import 一个普通类, 也可以被注册到 IOC 容器中
MyImportSelector.class // 根据 ImportSelector 接口的 selectImports()方法 返回值 String[]
})
public @interface MyEnableAutoImportBeans {
String value() default "test-liy";
String name() default "";
int id() default 0;
}
核心 MyImportSelector
/**
* 实现 ImportSelector 接口, 实现 selectImports() 方法返回 String[] 为类的全路径类名的数组
* @Import( value = { MyImportSelector.class } ) 在@Import中使用 返回的类都将会实例化到 Spring IOC容器
**/
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
// 遍历最终该 MyImportSelector 作用的类上所有标注的注解: 最终是作用在了AppConfig上了
importingClassMetadata.getAnnotationTypes().forEach( t -> {
System.out.println( " AnnotationTypes <> " + t );
});
// 拿到 @MyEnableAutoImportBeans 注解的所有 属性值
Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(MyEnableAutoImportBeans.class.getName());
annotationAttributes.forEach( (k,v) -> {
System.out.println( " @MyEnableAutoImportBeans 注解中属性: " + k + " = " + v );
});
/**
* 核心 返回值 String[] 都将会被实例化, 注册到 Spring 容器 ( 默认是,单例的)
*/
return new String[]{
Student.class.getName(),
"com.liy.jiagou.components.Tree"
};
}
}
代码仓库: https://gitee.com/crazyliyang/video-teaching
总结:
@Import( value = { ImportSelector.class } )
在@Import中的 ImportSelector#selectImports() 返回的全限定类名数组.String[ ] 中所有的类, 都将会被实例化并且注册到 Spring IOC容器中