今天來分享一下 pig4cloud
中涉及的 @Import
的注入形式。經過不一樣形式的注入方式,最大程度使得架構簡潔。spring
來看 EnablePigxDynamicRoute
這個註解,當咱們須要開始動態數據源時,只須要在main 方法加上此註解便可。
服務器
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(DynamicRouteAutoConfiguration.class)
public @interface EnablePigxDynamicRoute {
}複製代碼
實際核心是引入 DynamicRouteAutoConfiguration
這個配置類,此類並未被Spring 掃描管理
架構
寫個簡單的例子ide
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 並未增長上文的聲明式註解,注入了一個全類型名稱的Beanspa
顧名思義導入的選擇器,當 @Import 引入的類是ImportSelector
接口的實現時,會按照此選擇器進行匹配注入code
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, args);
Assert.isTrue(context.containsBean("com.pig4cloud.spring.learn.demo1.Dog"), "error dog bean");
}
}複製代碼
當@Import 引入的是ImportBeanDefinitionRegistrar
接口實現類,會自動引入registerBeanDefinitions
定義的Beancdn
以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 {
}複製代碼