Spring 注解之 @Import

@Import注解是用于给Spring容器导入组件,其主要的使用方式有下列三种

一、@Import

  1、@Import注解的详细信息如下:

1
2
3
4
5
6
7
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
  // @Import注解的取值是一个Class类型的数组,可以同时填写多个类的字节码文件 
    Class<?>[] value();
}

  2、@Import注解的使用位置

1
2
3
4
public enum ElementType {
    // 使用在类上、接口上(包括注解类型)、或者是枚举声明上
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

  3、@Import注解语法格式

    @Import({类1.class,类2.class,类3.class......}) 

  4、测试@Import注解

    一、准备几个测试类,PineApple,Plum、WaterMelon

    二、Spring的配置类

1
2
3
4
5
@Configuration
// 使用@Import将下面三个组件导入到Spring中,交由Spring容器进行管理
@Import({PineApple.class,Plum.class,WaterMelon.class})
public class SpringConfiguration {
}

    三、测试类

1
2
3
4
5
6
7
8
9
10
11
12
public class SpringDemo {
     
    @Test
    public void springTest01() {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        // 获取并输出所有Bean的名称
        String[] beanDefinitionNames2 = context.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames2) {
            System.out.println(beanDefinitionName);
        }
    }
}

    四、测试结果

1
2
3
4
5
6
7
8
9
10
11
12
// Spring容器自身组件
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
// Spring配置类
springConfiguration
// 自定义组件
com.spring01.bean.PineApple
com.spring01.bean.Plum
com.spring01.bean.WaterMelon

  

二、实现ImportSelector接口&&@Import注解

  1、自定义类(MyImportSelector)实现ImportSelector接口

1
2
3
4
5
6
7
8
9
public class MyImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // 定义一个字符串数组,里面定义你要注入到Spring容器中的类,(包类路径)
        String[] strArr = {"com.spring01.bean.WaterMelon","com.spring01.bean.PineApple"};
 
        return strArr;
    }
}

  2、配置类

1
2
3
4
5
@Configuration
// 导入自定义类MyImportSelector
@Import(MyImportSelector.class)
public class SpringConfiguration {
}

  3、测试类

1
2
3
4
5
6
7
8
9
10
11
12
public class SpringDemo {
 
    @Test
    public void springTest01() {
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        // 获取并输出所有Bean的名称
        String[] beanDefinitionNames2 = context.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames2) {
            System.out.println(beanDefinitionName);
        }
    }
}

  4、测试结果

1
2
3
4
5
6
7
8
9
10
11
// Spring容器自身组件
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
// Spring配置类
springConfiguration
// 自定义要导入的组件
com.spring01.bean.WaterMelon
com.spring01.bean.PineApple

  

三、实现ImportBeanDefinitonRegistrar接口&&@Import注解

  1、自定义类MyImportBeanDefinitionRegistrar实现ImportBeanDefinitionRegistrar接口,并且手动实现registerBeanDefinitions方法

1
2
3
4
5
6
7
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {     // 指定Bean的信息
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Plum.class);        // 注册bean时指定bean对应的id
        registry.registerBeanDefinition("plum",rootBeanDefinition);
    }
}

  2、配置类

1
2
3
4
@Configuration
@Import({MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
public class SpringConfiguration {
}

  3、测试类

1
2
3
4
5
6
7
8
@Test
public void springTest01() {
    ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class);
    // 获取并输出所有Bean的名称
    String[] beanDefinitionNames2 = context.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames2) {    System.out.println(beanDefinitionName);
    }
}

  4、测试结果

1
2
3
4
5
6
7
8
9
10
11
12
13
// Spring容器自身组件
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
// Spring配置类
springConfiguration
// 使用实现ImportSelector接口和@Import注解实现注入组件
com.spring01.bean.PineApple
com.spring01.bean.WaterMelon
// 使用实现ImportBeanDefinitionRegistrar接口和@Import注解实现注入组件
plum

  

 

posted @   变体精灵  阅读(456)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示