@Import注解的详细介绍--三种使用方式-史上最全

1.@Import注解的定义

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
    Class<?>[] value();
}

简单来说就是导入需要类的字节码,他会默认调用该类的无参构造方法

2.导入的类必须存在无参的构造方法

3.@Import导入的组件命名是类的全限定名

4.通过@Bean导入的就是方法名

@Import({People.class})
@Configuration(proxyBeanMethods = false)//告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig 


@Bean//给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
    public People people() {
        return new People(1, "迁承", dog());
    }
  public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(QianchengApplication.class, args);
//        testConfiguration(context);
        testImport(context);
    }

    private static void testImport(ApplicationContext context) {
        /**
         * com.qiancheng.pojo.People  @Import导入进来的bean的默认名字是:全类名;
         * people  自己定义的bean
         */
        String[] names = context.getBeanNamesForType(People.class);
        for (String name : names) {
            System.out.println(name);
        }
    }

5.Import的第二种用法ImportSelector

@Import(MyImportSelector.class)
其中MyImportSelector实现了ImportSelector接口

public class MyImportSelector implements ImportSelector {
    /**
     * importingClassMetadata:参数会拿到 被Import注解修饰的所有注解信息
     * 只需要将导入的类的全限定名称放入数组中返回即可
     *
     * @param importingClassMetadata
     * @return
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"com.qiancheng.pojo.People", "com.qiancheng.pojo.Dog"};
    }
}

6.Import的第三种用法ImportBeanDefinitionRegistrar接口

@Import(MyImportDefintionRegistrar.class)

MyImportDefintionRegistrar实现了ImportDefintionRegistrar接口 实现这个接口的有点是,可以拿到Bean的注册器,可以自己根据条件进行注册,删除,查找bean 等等操作

public class MyImportDefintionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     * importingClassMetadata 导入类的所有注解信息
     * registry : 可以对未定义的Bean进行注册
     *
     * @param importingClassMetadata
     * @param registry
     */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition beanDefinition = new RootBeanDefinition(People.class);
        registry.registerBeanDefinition("people",beanDefinition);
    }
}
posted @ 2021-04-06 20:10  迁承_0204  阅读(1749)  评论(0编辑  收藏  举报