@Import

SpringBoot@Enable*开头的注解底层依赖于@Import注解导入一些类,使用@Import导入的类会被Spring加载到IOC容器中,

4种用法

  • 直接导入Bean就比较简单了,新建一个User
public class User{
    private String name;
    private String address;
}

然后在启动类上使用@Import注解导入即可

@SpringBootApplication
@Import(User.class)
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
        System.out.println(context.getBean(User.class));
    }
}

这里需要注意的是,通过上下文获取Bean时,需要使用Bean的class,因为通过Bean的方式导入,Spring存入IOC容器,是用类的全类名存储的。可以使用上下文的getBeansOfType方法查看,返回的是Map对象。

{com.tenghu.sbc.entity.User=User(name=null, age=0)}

从返回的结果可以看出,key就是存的User的全类名。

  • 通过配置类导入Bean,创建一个配置类;
public class UserConfig {
    @Bean(name = "user")
    public User user(){
        return new User();
    }
}

然后通过@Import导入这个配置类

@SpringBootApplication
@Import(UserConfig.class)
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class,args);
        System.out.println(context.getBean(User.class));
    }
}

通过配置类的方式可以在配置类里面定义多个Bean,当导入配置类时,配置类下定义的Bean都会被导入。

  • 导入ImportSelector实现类
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{User.class.getName()};
    }
}

实现ImportSelector类,必须实现selectImports,然后返回需要导入的Bean。与上面一样使用@Import导入这个实现类。

@Import(MyImportSelector.class)


  • 导入ImportBeanDefinitionRegistrar实现类
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(User.class).getBeanDefinition();
        registry.registerBeanDefinition("user",beanDefinition);
    }
}

使用方式一样,通过@Import导入

@Import(MyImportBeanDefinitionRegistrar.class)
原文地址:https://www.cnblogs.com/smallfa/p/15126726.html