@Import注解的三种使用方式

本文详细介绍了@Import注解的三种使用方式:直接导入组件类、使用ImportSelector选择导入和借助ImportBeanDefinitionRegistrar手动注册。通过实例展示了如何在Spring中实现这三种方式,为理解和运用@Import提供了清晰的指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方式1:@Import({XXX.class,XXX.class})

配置类:

package com.jarvis.config;

@Import({com.jarvis.pojo.User.class})  //这里将User类注册到容器
@Configuration
public class JarvisConfig {
}

要import的类
注意,这个类没有加@Component,正常情况下无法被注册到容器中

package com.jarvis.pojo;

public class User {
}

测试类

public static void main(String[] args) {
    ApplicationContext context = new AnnotationConfigApplicationContext(JarvisConfig.class);
    System.out.println(context.getBean(User.class));
}
======output:
com.jarvis.pojo.User@33cb5951



方式2:@Import(XXXImportSelector.class)

  • 这种方式的前提就是一个类要实现ImportSelector接口
  • selectImports的返回值就是我们实际上要导入到容器中的组件全类名
  • AnnotationMetadata表示当前被@Import注解给标注的所有注解信息
  • selectImports方法可以返回空数组但是不能返回null,否则会报空指针异常!

编写ImportSelector

public class JarvisImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        System.out.println("被@Import标注的类的注解:"+importingClassMetadata.getAnnotationTypes());  
        return new String[]{"com.jarvis.pojo.User"};
    }
}

配置类:

@Import(JarvisImportSelector.class)
@Configuration
public class JarvisConfig {
}

测试类

public static void main(String[] args) {
    ApplicationContext context = new AnnotationConfigApplicationContext(JarvisConfig.class);
    System.out.println(context.getBean(User.class));
}
======output:@Import标注的类的注解:[org.springframework.context.annotation.Import, org.springframework.context.annotation.Configuration]
com.jarvis.pojo.User@31206beb

方式3:@Import(XXXRegistrar.class)

  • 需要一个类实现ImportBeanDefinitionRegistrar接口
  • registerBeanDefinitions方法其实是将要注册类的BeanDefinition注册进入到beanFactory中,然后通过spring的生命周期流程生成一个bean

编写ImportBeanDefinitionRegistrar

public class JarvisRegistrar implements ImportBeanDefinitionRegistrar {
    /**
    * 将要注册类的BeanDefinition注册进入到beanFactory中,然后通过spring的生命周期流程生成一个bean
    * importingClassMetadata--表示当前被@Import注解给标注的所有注解信息
    * registry--表示用于注册定义一个bean
    */
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        System.out.println(importingClassMetadata.getAnnotationTypes());
		//生成一个BeanDefinition
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(User.class);
        //注册这个BeanDefinition  名字为user123
        registry.registerBeanDefinition("user123", rootBeanDefinition);
    }
}

配置类

@Import(JarvisRegistrar.class)
@Configuration
@ComponentScan("com.jarvis")
public class JarvisConfig {
}

通过BeanFactory后置处理器查看是否已经将User类的BeanDefinition注册

@Component
public class JarvisBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        boolean user123 = beanFactory.containsBean("user123"); 
        System.out.println(user123);
    }
}

测试程序

public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(JarvisConfig.class);
        System.out.println(context.getBean("user123",User.class));
    }
======output:
[org.springframework.context.annotation.Import, org.springframework.context.annotation.Configuration, org.springframework.context.annotation.ComponentScan]
true      //表示已经将User注册到BeanDefinition中了
com.jarvis.pojo.User@146044d7




@Import注解的三种使用方式总结

第一种用法:@Import({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名
第二种用法:ImportSelector:返回需要导入的组件的全类名数组,springboot底层用的特别多【重点 】
第三种用法:ImportBeanDefinitionRegistrar:手动注册bean到容器

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值