首页 归档 关于 learn love 工具

Spring @Import 注解介绍

提供与 xml 中 <import/>等效的功能, 允许去导入@Configuration类, ImportSelector 和 ImportBeanDefinitionRegistrar 的具体实现, 以及常规组件类 。
类似于AnnotationConfigApplicationContext.register(java.lang.Class<?>...) 这种操作。

可以在类级别声明或作为元注释声明。如果需要导入XML或其他非@Configuration bean定义资源,请改用@ImportResource注释

1. 注册具体类

将 @Import 标记的类注册成 bean。

// Test 类   这里不需要任何注解(@Component、@Service)这些都不需要
public class Test {

}


// MyConfig 类
@Configuration
@Import({Test.class})
public class AppConfig {

}

2. 导入@Configuration 配置类下的bean定义

@Configuration
public class AppConfigAux { 
    // 假设这里内部由很多使用了@Bean注解的方法 

}

// AppConfig 类
@Configuration
@Import({AppConfigAux.class})
public class AppConfig {

}

// 开始测试的Test类
public class Test {  
    public static void main(String[] args) { 
    new AnnotationConfigApplicationContext(AppConfig.class); 
    } 
}

3. 导入ImportBeanDefinitionRegistrar的具体实现类

通过方法 registerBeanDefinitions进行注入

// AppConfigAux 类  不需要任何注解
public class AppConfigAux implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,     BeanDefinitionRegistry registry) {
        registry.registerBeanDefinition("simple",BeanDefinitionBuilder.rootBeanDefinition(Simple.class).getBeanDefinition());
    }
}

// AppConfig 类
@Configuration
@Import({AppConfigAux.class})
public class AppConfig {

}

// Simple 类  不需要注解
pulic class Simple {

}

// 开始测试的Test类
public class Test {  
    public static void main(String[] args) { 
        new AnnotationConfigApplicationContext(AppConfig.class); 
        } 
    }

4. 导入ImportSelector的具体实现

// AppConfigAux 类  不需要任何注解
public class AppConfigAux implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //返回String[]含义:多个类的完全限定名,表示注入这些类到容器中,bean名称就是类的完全限定名(保证唯一性)
         return new String[] { Simple.class.getName() }; 
         } 
}

// AppConfig 类
@Configuration
@Import({AppConfigAux.class})
public class AppConfig {

}

// Simple 类  不需要注解
pulic class Simple {

}

// 开始测试的Test类
public class Test {  
    public static void main(String[] args) { 
        new AnnotationConfigApplicationContext(AppConfig.class); 
        } 
}