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

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

@Import導入一個組件

來看 EnablePigxDynamicRoute 這個註解,當咱們須要開始動態數據源時,只須要在main 方法加上此註解便可。segmentfault

@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 並未增長上文的聲明式註解,注入了一個全類型名稱的Beanide

ImportSelector 接口

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

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");
    }
}

ImportBeanDefinitionRegistrar

當@Import 引入的是ImportBeanDefinitionRegistrar接口實現類,會自動引入registerBeanDefinitions 定義的Beancode

以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 {

}

image

相關文章
相關標籤/搜索