五、【注解】Spring注解@Import

@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

  1. 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,此类省略写了
        }
    
    }
    
  2. 配置类

    @Configuration
    @Import({MyImportSelector.class})
    public class MyConfig {
    
    }
    

三、ImportBeanDefinitionRegistrar

  1. 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);
            }
        }
    }
    
  2. 配置类

    @Configuration
    @Import({MyImportBeanDefinitionRegistrar.class})
    public class MyConfig {
    
        @Bean
        public Fish fish() {
            return new Fish();
        }
    
    }
    
原文地址:https://www.cnblogs.com/zhangjianbing/p/13716226.html