Spring @Import 注解介绍

Spring @Import 注解介绍

提供与 xml 中 <import/> 等效的功能, 允许去导入@Configuration类, ImportSelector 和 ImportBeanDefinitionRegistrar 的具体实现, 以及常规组件类 (这一句划重点)。

类似于 AnnotationConfigApplicationContext.register(java.lang.Class<?>...) 这种操作。

可以在类级别声明或作为元注释声明。

如果需要导入XML或其他非@Configuration bean定义资源,请改用@ImportResource注释。
以上是官方的意思

不了解ApplicationContext的可能会懵逼。
简单说明: AnnotationConfigApplicationContext 是 ApplicationContext 的具体实现, ApplicationContext 又能代表Spring IOC 容器。(不过这都是题外话)

通过使用来慢慢解析官方给出的解释吧。

这是第一种方式用法

往简单了说就是将 @Import 标记的类注册成 bean。 (就是划重点地方的 "常规组件类"这个描述的具现化.)
示例:
// Test 类   这里不需要任何注解(@Component、@Service)这些都不需要
public class Test {}


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

当AppConfig类被处理的时候, 顺便就把Test类给注册成bean了。

第二种用法 “导入@Configuration类”的具现化

// AppConfigAux 类
@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); } }

这里运行完成后, 会把 AppConfigAux 类中定义的所有Bean也全部加载了(包含 AppConfigAux)。 虽然我没遇到过不得不使用这种方式的情况,但是源码里面有啊。

第三种用法 “导入ImportBeanDefinitionRegistrar的具体实现”

// 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); } }

这里运行完成后, 会把 AppConfigAux 方法中指定的类加载(不包含 AppConfigAux 本身)。 我也没用过。。

第四种 也是最后一种 “导入ImportSelector的具体实现”

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

// 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); } }

以上是对@Import的使用介绍, 也是对上面第一行和第二行文字描述的介绍

可以在类级别声明或作为元注释声明。

这句是什么意思呢? 1.该注解只能在类上面使用,不能在方法上面 2.元注释就是 作为 注解 的 注解

 

转载:https://www.jianshu.com/p/56d4cadbe5c9

 

 

 

 

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
Spring @Import 注解介绍 Spring @Import 注解介绍 Spring @Import 注解介绍 Spring @Import 注解介绍   TRANSLATE with Spring @Import 注解介绍 COPY THE URL BELOW Spring @Import 注解介绍 Spring @Import 注解介绍 Back EMBED THE SNIPPET BELOW IN YOUR SITE Spring @Import 注解介绍 Enable collaborative features and customize widget: Bing Webmaster Portal Back
上一篇:c – 以root身份打开文件,但在读取之前删除权限?


下一篇:linux – 如何学习使用/ proc和/ sys做什么