詳解Spring 註解之@Import 注入的各種花活
阿新 • • 發佈:2020-01-19
今天來分享一下 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 { }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。