Import注解的作用

HeJin大约 2 分钟源码解析bean的注入

作用

注解的定义信息:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {

   /**
    * {@link Configuration @Configuration}, {@link ImportSelector},
    * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import.
    */
   Class<?>[] value();

}

可以发现,传入参数是一个Class数组。所以,我们可以传入多个Class对象。

查看该注解的注释信息,就可以发现其作用:

  • 导入一个或多个组件类——通常是@Configuration类。
  • 提供与Spring XML中的元素等效的功能。允许导入@Configuration类,ImportSelectorImportBeanDefinitionRegistrar实现,以及常规组件类
  • 在导入的@Configuration类中声明的@Bean定义应该通过使用@Autowired注入来访问。可以自动连接bean本身,也可以自动连接声明bean的配置类实例。后一种方法允许在@Configuration类方法之间显式的、ide友好的导航。
  • 可以在类级别声明,也可以作为元注释声明。
  • 如果需要导入XML或其他non-@Configuration bean定义资源,则使用@ImportResource注释。

也就是说,@Import注解可以往容器中导入bean,可以根据需要选择不同的方式。

导入@Configuration配置类

SpringBoot默认会扫描主启动类所在的包以及子包下的加了相应注解的bean。如果不是在默认的包下的bean,是不会被加载到容器中的。这时,我们可以使用@Import注解导入,此时导入的类可以在任意的包下。

一般用于导入配置类,我们导入一个试试:

// SimpleConfig在com包下,主启动类在com.sanfen包下,不同包
@Configuration
public class SimpleConfig {

    @Bean
    public User user(){
        return new User(1226999203, "zs", 25);
    }
}

在主启动类中获取SimpleConfigUser,发现没有被扫描到:

image-20221231153337204
image-20221231153337204

我们加上@Import注解:

image-20221231153459391
image-20221231153459391

发现SimpleConfig这个配置类被导入了,而且里面定义的bean也被导入了。