@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
* or regular component classes to import.
*/
Class<?>[] value();
}
@Import注解的作用是像IOC容器中导入我们自己想要的Bean,有三种方式:
一、普通导入
@Configuration
@Import({User.class})// 导入一个叫User的类,那直接使用@Service不行吗?如果User是第三方jar包的类呢?
public class MyConfig {
}
二、ImportSelector
-
ImportSelector实现类
/** * @author zhangjianbing * time 2020/09/21 * https://www.zhangjianbing.com */ public class MyImportSelector implements ImportSelector { /** * * @param importingClassMetadata 导入类的条件信息 */ @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.zhangjianbing.spring.importselector.Blue"};// 向容器中注册Blue类,一个pojo,此类省略写了 } }
-
配置类
@Configuration @Import({MyImportSelector.class}) public class MyConfig { }
三、ImportBeanDefinitionRegistrar
-
ImportBeanDefinitionRegistrar实现类
/** * @author zhangjianbing * time 2020/09/21 * https://www.zhangjianbing.com */ public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { boolean flag = registry.containsBeanDefinition("fish"); if (flag) {// 这个地方是:如果IOC容器中包含了一个叫fish的类,那就向容器中注册一个叫rainBow的类,灵活性很强 BeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class); registry.registerBeanDefinition("rainBow", beanDefinition); } } }
-
配置类
@Configuration @Import({MyImportBeanDefinitionRegistrar.class}) public class MyConfig { @Bean public Fish fish() { return new Fish(); } }