Spring的@Import注解介绍

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

一、@Import是什么?

@Import注解是Spring框架的注解用于向Spring的IoC容器导入额外的组件。

二、@Import的作用

使用@Import注解可以实现

  • 快速导入Bean到IOC容器中
    快速地向Spring的IoC容器中导入一个或多个组件第三方包 而不用使用标签在XML文件中手动定义。

  • 控制是否注入该Bean通过条件来控制注入哪些Bean到Spring容器中
    当在@Configuration标注的类上使用@Import引入了一个类后就会把该类注入容器中。
    当然除了@Configuration 比如@Component、@Service等一样也可以。

三、@Import的特点

  • @Import只能用在类上或者配置类上

四、@Import的应用

比如以下熟悉的注解等统一采用的都是借助@Import注解来实现的。

  • @EnableAsync
  • @EnableCaching
  • @EnableScheduling

五、 @Import有三种使用方式

5.1、直接填class数组方式指定要导入的组件的类

使用时可以将一个或多个要导入的组件的全类名数组传递给@Import注解的value属性

@Import{ 要导入的容器中的组件 } 容器会自动注册这个组件id默认是全类名
直接填对应的class数组class数组可以有0到多个。

语法如下

@Import({ 类名.class , 类名.class... })
public class TestDemo {
}

@Import(value={Cat.class,Dog.class})
public class AnimalConfiguration {
}

对应的import的bean都将加入到spring容器中这些在容器中bean名称是该类的全类名 比如com.XXXXXXX.类名

5.2、ImportSelector方式【重点】

使用ImportSelector接口来返回要需要导入的组件的全类名数组。

@Import(AnimalImportSelector.class)
public class AnimalConfiguration {
}
public class AnimalImportSelector implements ImportSelector {
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		return new String[]{Cat.class.getName(), Dog.class.getName()};
	}
}

SpringBoot底层源码用的特别多
比如@EnableAutoConfiguration注解的源码

  • 开启自动配置在项目启动时向IOC容器中快速注入Bean 而已。
  • @EnableAutoConfiguration 注解作用@Import 的一种形式
    源码如下
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

看到有个 @Import 注解使用的是ImportSelector的方式

5.3、ImportBeanDefinitionRegistrar方式

使用ImportBeanDefinitionRegistrar接口来返回要导入的组件的全类名数组属于手动注册bean到容器。

@Import(AnimalImportBeanDefinitionRegistrar.class)
public class AnimalConfiguration {
}
public class AnimalImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		registry.registerBeanDefinition(Cat.class.getName(), new RootBeanDefinition(Cat.class));
		registry.registerBeanDefinition(Dog.class.getName(), new RootBeanDefinition(Dog.class));
	}
}

六、参考文章

https://www.cnblogs.com/lm970585581/p/13066139.html

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring