使用@Import注解给容器中快速导入一个组件

注册bean的方式

向Spring容器中注册bean通常有以下几种方式:

  1. 包扫描+给组件标注注解(@Controller、@Servcie、@Repository、@Component),但这种方式比较有局限性,局限于我们自己写的类
  2. @Bean注解,通常用于导入第三方包中的组件
  3. @Import注解,快速向Spring容器中导入一个组件

1.@Import注解概述

@Import注解提供了@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();

}

从源码里面可以看出@Import可以配合Configuration、ImportSelector以及ImportBeanDefinitionRegistrar来使用,下面的or表示也可以把

Import当成普通的bean来使用。

注意:@Import注解只允许放到类上面,不允许放到方法上。

2.@Import注解的使用方式

@Import注解的三种用法主要包括:

  1. 直接填写class数组的方式
  2. ImportSelector接口的方式,即批量导入,这是重点
  3. ImportBeanDefinitionRegistrar接口方式,即手工注册bean到容器中

3.@Import导入组件的简单示例

3.1.没有使用@Import注解时的效果

首先,我们创建一个Color类,这个类是一个空类,没有成员变量和方法,如下所示:

package com.tianxia.springannotation.entity;

/**
 * 颜色类
 * @author liqb
 * @date 2023-04-23 15:35
 **/
public class Color {
}

然后,创建测试方法,输出Spring容器中所有bean定义的名字,来查看是否存在Color类对应的bean实例,以此来判断Spring容器中是否注册有Color类对应的bean实例。

/**
 * 测试Import
 * @author liqb
 * @date 2023-04-23 15:38
 */
@Test
public void testImport() {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig02.class);
    String[] definitionNames = applicationContext.getBeanDefinitionNames();
    for (String name : definitionNames) {
        System.out.println(name);
    }
}

输出的结果信息如下所示:
在这里插入图片描述

可以看到Spring容器中并没有Color类对应的bean实例。

3.2.使用@Import注解时的效果

配置类上添加一个**@Import注解,并将Color**类填写到该注解中

package com.tianxia.springannotation.config;

import com.tianxia.springannotation.config.configEntity.CustomerScope;
import com.tianxia.springannotation.entity.Color;
import com.tianxia.springannotation.entity.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Scope;

/**
 * 配置类
 * @author liqb
 * @date 2023-04-23 10:45
 **/
@Configuration
@Import(Color.class)
public class MainConfig03 {

    /**
     * 创建person实例
     * @author liqb
     * @date 2023-04-23 09:46
     * @return
     */
    @Bean("person03")
    @Scope(CustomerScope.CUSTOMER_SCOPE)
    public Person person() {
        System.out.println("给容器中添加咱们这个Person对象...");
        return new Person("liqb", 24);
    }
}

运行测试方法,输出的结果信息如下所示:

在这里插入图片描述

使用@Import注解快速地导入组件时,容器中就会自动注册这个组件,并且id默认是组件的全类名。

@Import注解还支持同时导入多个类

/**
 * 红色类
 * @author liqb
 * @date 2023-04-23 15:43
 **/
public class Red {
}

将Red类添加到@Import注解中

package com.tianxia.springannotation.config;

import com.tianxia.springannotation.config.configEntity.CustomerScope;
import com.tianxia.springannotation.entity.Color;
import com.tianxia.springannotation.entity.Person;
import com.tianxia.springannotation.entity.Red;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Scope;

/**
 * 配置类
 * @author liqb
 * @date 2023-04-23 10:45
 **/
@Configuration
@Import({Color.class, Red.class})
public class MainConfig03 {

    /**
     * 创建person实例
     * @author liqb
     * @date 2023-04-23 09:46
     * @return
     */
    @Bean("person03")
    @Scope(CustomerScope.CUSTOMER_SCOPE)
    public Person person() {
        System.out.println("给容器中添加咱们这个Person对象...");
        return new Person("liqb", 24);
    }
}

运行测试类,输出的结果信息如下所示:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值