先看下這個註解都有什麼屬性spring
public @interface Import {
/**
* {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
* or regular component classes to import.
*/
Class<?>[] value();
}
複製代碼
看value屬性上面的註解 value能夠放兩種重要的類 ImportSelector和ImportBeanDefinitionRegistrar,固然也能夠放普通類,就是不繼承這兩種類,因此若是想了解@Import有什麼做用就要了解ImportBeanDefinitionRegistrar和 ImportSelector有什麼用數組
public interface ImportSelector {
String[] selectImports(AnnotationMetadata importingClassMetadata);
}
複製代碼
ImportSelector 是一個接口,通常咱們都是實現這個接口的selectImports方法,這個方法有什麼做用?這個方法主要是會spring執行,返回值是咱們想讓spring管理的bean全類名。 好比我想讓spring幫我管理A對象和B對象,這個方法就會返回一個數組{com.xx.a,cong.xx.b},spring收到返回值以後就會將這兩個bean進行處理,入參AnnotationMetadata有什麼做用?可讓selectImports這個方法拿到註解的內容,而後進行所須要的處理,好比說須要讓bena管理的是從註解中獲取到springboot
典型的應用就是springboot自動裝配用到的 AutoConfigurationImportSelector 這個類繼承了ImportSelector,作了什麼呢? 能夠參考 juejin.im/post/5efd98… 有對這個類進行解釋bash
public interface ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
}
複製代碼
ImportBeanDefinitionRegistrar 一樣也是一個接口,通常咱們也是實現ImportBeanDefinitionRegistrar#registerBeanDefinitions。這個方法顧名思義,就是能夠註冊beanDefinition。一樣這個方法也是spring幫咱們調用的,調用的過程會傳入registry,beanDefinition註冊器,經過這個咱們能夠本身實現註冊想要註冊的beanmybatis
在mybatis和spring整合過程當中,MapperScannerRegistrar起到了關鍵的做用。MapperScannerRegistrar實現了ImportBeanDefinitionRegistrar#registerBeanDef 在這個方法中,對包進行掃描,而後將mapper註冊到spring容器中,詳情見 juejin.im/editor/draf…app
因此@import 顧名思義就是導入,做用其實就是這兩個類的做用,一個是返回須要spirng幫忙管理的bean名稱字符串,一個是直接拿註冊器,直接註冊本身想要註冊的類post
能夠看到不少@Enablexxx的註解裏面其實都至關於繼承了@Import好比:spa
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
}
複製代碼
通常咱們用這個註解表示開啓aop開關,其實就是掃描@Import 而後調用AspectJAutoProxyRegistrar#registerBeanDefinitions方法,往spring容器中 註冊 AnnotationAwareAspectJAutoProxyCreator 這個後置處理器去進行aop代理的處理代理