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() }; }
}
// 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.元注釋就是 作為 注解 的 注解
AnnotationConfigApplicationContext.register(java.lang.Class<?>...) 的內部實現屬于IOC的范疇,不做具體描述
最后提到的@ImportResource就不做介紹了