小言_互联网的博客

Spring的@Import注解介绍

405人阅读  评论(0)

一、@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


转载:https://blog.csdn.net/wstever/article/details/128594733
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场