1. 程式人生 > 程式設計 >詳解Spring 註解之@Import 注入的各種花活

詳解Spring 註解之@Import 注入的各種花活

今天來分享一下 pig4cloud 中涉及的 @Import 的注入形式。通過不同形式的注入方式,最大程度使得架構簡潔。

@Import匯入一個元件

來看 EnablePigxDynamicRoute 這個註解,當我們需要開始動態資料來源時,只需要在main 方法加上此註解即可。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(DynamicRouteAutoConfiguration.class)
public @interface EnablePigxDynamicRoute {
}

實際核心是引入 DynamicRouteAutoConfiguration 這個配置類,此類並未被Spring 掃描管理

寫個簡單的例子

public class Dog {
}

@Import({Dog.class})
@SpringBootApplication
public class SpringLearnApplication {

  public static void main(String[] args) {
    ConfigurableApplicationContext context = SpringApplication.run(SpringLearnApplication.class,args);
    Assert.isTrue(context.containsBean("com.pig4cloud.spring.learn.demo1.Dog"),"error dog bean");
  }
}

注意 Dog 並未增加上文的宣告式註解,注入了一個全型別名稱的Bean

ImportSelector 介面

顧名思義匯入的選擇器,當 @Import 引入的類是 ImportSelector 介面的實現時,會按照此選擇器進行匹配注入

public class DogImportSelector implements ImportSelector {
  @Override
  public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    ... 匹配邏輯查詢出來一堆要注入的全類名
    return new String[]{"com.pig4cloud.spring.learn.demo1.Dog"};
  }
}

@Import({DogImportSelector.class})
@SpringBootApplication
public class SpringLearnApplication {

  public static void main(String[] args) {
    ConfigurableApplicationContext context = SpringApplication.run(SpringLearnApplication.class,"error dog bean");
  }
}

ImportBeanDefinitionRegistrar

當@Import 引入的是 ImportBeanDefinitionRegistrar 介面實現類,會自動引入 registerBeanDefinitions 定義的Bean

以pig 的資源伺服器配置設定,自動引入了一個 PigxResourceServerConfigurerAdapter 的類,且 bean 名稱為 resourceServerConfigurerAdapter

public class PigxSecurityBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

  @Override
  public void registerBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry) {
    GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
    beanDefinition.setBeanClass(PigxResourceServerConfigurerAdapter.class);
    registry.registerBeanDefinition(SecurityConstants.RESOURCE_SERVER_CONFIGURER,beanDefinition);

  }
}

這也就意味著,若使用 EnablePigxResourceServer 註解即可開啟 pig4cloud 封裝的oauth 資源客戶端操作類,也是原始碼的入口

@Import({PigxSecurityBeanDefinitionRegistrar.class})
public @interface EnablePigxResourceServer {

}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。