Spring进阶(十四)之@Import注解

目录

@Import的使用

使用步骤:

@import的value参数常见的六种用法

value为普通类

value为@Configuration标注的类

value为@CompontentScan标注的类

先来看一下相关的几个接口

ImportBeanDefinitioRegistrar接口

BeanDefinitionRegistry接口

BeanNameGenerator接口

BeanDefinition接口

value为ImportBeanDefinitionRegistrar接口类型

步骤:

案例:

value为ImportSelector接口类型

用法:

案例:

value为DeferredImportSelector接口类型

延迟导入

案例:


目前为止,注解的方式批量注册bean,我们介绍了2种方式: 

  • @Configuration结合@Bean注解的方式
  • @CompontentScan扫描包的方式

但是也存在一定的局限性,我们来看看下面两种情况:

情况一:

如果需要注册的类是在第三方的jar中,那么我们如果想注册这些bean有2种方式:

  • 通过@Bean的方式一个一个注册
  • 通过@ComponentScan的方式。默认的@ComponentScan是无能为力的,他只能注册@Component,@Service等那四个注解标记的类,所以我们需要用自定义过滤器的方式

情况二:

通常我们的项目中有很多子模块,可能每个模块都是独立开发的,最后通过jar的方式引进来,每个模块中都有各自的@Configuration或者使用@CompontentScan标注的类,此时如果我们只想使用其中几个模块的配置类,怎么办?

@Import的使用

对于@Import,我们可以先来看看其源码:

@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();
}

spring中对它的解释是:和xml配置的标签作用一样,允许通过它引入@Configuration标注的类 , 引入ImportSelector接口和ImportBeanDefinitionRegistrar接口的实现, 4.2版本以后也可以引入普通组件类

使用步骤:

  1. 将@Import标注在类上,设置value参数
  2. 将@Import标注的类作为AnnotationConfigApplicationContext构造参数创建 AnnotationConfigApplicationContext对象
  3. 使用AnnotationConfigApplicationContext对象

@import的value参数常见的六种用法

  1. value为普通的类
  2. value为@Configuration标注的类
  3. value为@CompontentScan标注的类
  4. value为ImportBeanDefinitionRegistrar接口类型
  5. value为ImportSelector接口类型
  6. value为DeferredImportSelector接口类型

value为普通类

public class Service1 {
}
public class Service2 {
}
@Import({Service1.class, Service2.class})
public class MainConfig1 {
}
class ImportTestApplicationTests {

    @Test
    void test1() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig1.class);
        for (String beanName:context.getBeanDefinitionNames()){
            System.out.println(beanName+"--->"+context.getBean(beanName));
        }
    }

}

运行后输出:

mainConfig1--->com.example.config.MainConfig1@76ed1b7c
com.example.service.Service1--->com.example.service.Service1@11fc564b
com.example.service.Service2--->com.example.service.Service2@394a2528

由输出结果可以看出:

  • 我们使用@Import注解成功将普通类对象注册到容器了,但是这些bean的名称是全类名,如果我们想指定名称的话,在对应的类上加上@Component注解指定名称即可。
  • 使用@Import的时候,也会连@Import标记的类一起注册到容器中。

value为@Configuration标注的类

@Configuration
public class ConfigModule1 {

    @Bean
    public String module1(){
        return "我是模块一配置类";
    }
}
@Configuration
public class ConfigModule2 {

    @Bean
    public String module2(){
        return "我是模块二配置类";
    }
}
@Import({ConfigModule1.class, ConfigModule2.class})
public class MainConfig2 {
}
class ImportTestApplicationTests {

    @Test
    void test1() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig2.class);
        for (String beanName:context.getBeanDefinitionNames()){
            System.out.println(beanNam
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰魄雕狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值