Spring之【Import】

发布于:2025-08-11 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

@Import注解

源码分析

使用示例

ImportSelector

源码分析

使用示例

DeferredImportSelector

源码分析

使用示例

ImportBeanDefinitionRegistrar

源码分析

使用示例


@Import注解

源码分析

  • 处理组件类上的@Import注解

  • 将@Import引入类对应的BeanDefinition对象添加到Spring容器中

使用示例

  • 定义一个普通Java类
package spring.useimport;

public class A {
}
  • 定义包扫描范围
package spring.useimport;

import org.springframework.context.annotation.ComponentScan;

@ComponentScan("spring.useimport")
public class SpringConfig {
}
  • 通过@Import注解将组件放入容器中
package spring.useimport;

import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

@Import(A.class)
@Component
public class ComponentA {
}
  • 测试结果
package spring.useimport;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
        A a = applicationContext.getBean(A.class);
        System.out.println(a);
    }
}

ImportSelector

源码分析

  • 执行ImportSelector的selectImports方法回调

使用示例

  • 定义一个普通Java类
package spring.useimport;

public class B {
}
  • 定义包扫描范围
package spring.useimport;

import org.springframework.context.annotation.ComponentScan;

@ComponentScan("spring.useimport")
public class SpringConfig {
}
  • 通过实现ImportSelector的selectImports方法将组件放入容器中
package spring.useimport;

import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

@Import(ImportSelectorForB.class)
@Component
public class ComponentB {
}
package spring.useimport;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class ImportSelectorForB implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{B.class.getName()};
    }
}
  • 测试结果
package spring.useimport;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
        B b = applicationContext.getBean(B.class);
        System.out.println(b);
    }
}

DeferredImportSelector

源码分析

  • 处理DeferredImportSelector

使用示例

  • 定义一个普通Java类
package spring.useimport;

public class C {
}
  • 定义包扫描
package spring.useimport;

import org.springframework.context.annotation.ComponentScan;

@ComponentScan("spring.useimport")
public class SpringConfig {
}
  • 通过实现DeferredImportSelector的selectImports方法将组件放入容器中
package spring.useimport;

import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

@Import(DeferredImportSelectorForC.class)
@Component
public class ComponentC {
}
package spring.useimport;

import org.springframework.context.annotation.DeferredImportSelector;
import org.springframework.core.type.AnnotationMetadata;

public class DeferredImportSelectorForC implements DeferredImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{C.class.getName()};
    }
}
  • 测试结果
package spring.useimport;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
        C c = applicationContext.getBean(C.class);
        System.out.println(c);
    }
}

ImportBeanDefinitionRegistrar

源码分析

  • 处理ImportBeanDefinitionRegistrar

  • 执行ImportBeanDefinitionRegistrar的registerBeanDefinitions方法回调

使用示例

  • 定义一个普通Java类
package spring.useimport;

public class D {
}
  • 定义包扫描规则
package spring.useimport;

import org.springframework.context.annotation.ComponentScan;

@ComponentScan("spring.useimport")
public class SpringConfig {
}
  • 通过ImportBeanDefinitionRegistrar的registerBeanDefinitions方法将组件放入容器中
package spring.useimport;

import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

@Import(ImportBeanDefinitionRegistrarForD.class)
@Component
public class ComponentD {
}
package spring.useimport;

import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class ImportBeanDefinitionRegistrarForD implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        // 将组件的Bean定义对象放入容器中
        RootBeanDefinition beanDefinition = new RootBeanDefinition(D.class);
        registry.registerBeanDefinition("d",beanDefinition);
    }
}
  • 测试结果
package spring.useimport;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
        D d = applicationContext.getBean(D.class);
        System.out.println(d);
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到