詳解Spring 注解之@Import 注入的各種花活
今天來分享一下 pig4cloud 中涉及的 @Import 的注入形式。通過不同形式的注入方式,最大程度使得架構(gòu)簡潔。
@Import導入一個組件
來看 EnablePigxDynamicRoute 這個注解,當我們需要開始動態(tài)數(shù)據(jù)源時,只需要在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 接口的實現(xiàn)時,會按照此選擇器進行匹配注入
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 接口實現(xiàn)類,會自動引入 registerBeanDefinitions 定義的Bean
以pig 的資源服務(wù)器配置設(shè)置,自動引入了一個 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 {
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用maven對springboot項目進行瘦身分離jar的多種處理方案
springboot項目打包一般我們都使用它自帶的spring-boot-maven-plugin插件,這個插件默認情況下,會把所有的依賴包全部壓縮到一個jar里面,今天給大家分享幾種方案來如何減小我們的打包文件,需要的朋友可以參考下2024-02-02
Spring?Security權(quán)限管理小結(jié)
SpringSecurity是一個權(quán)限管理框架,核心是認證和授權(quán),前面已經(jīng)系統(tǒng)的給大家介紹過了認證的實現(xiàn)和源碼分析,本文重點來介紹下權(quán)限管理,需要的朋友可以參考下2022-08-08
Spring?Boot?如何通過ServletRequestHandledEvent事件實現(xiàn)接口請求的性能監(jiān)控
在Spring框架中,監(jiān)控接口請求的性能可以通過ServletRequestHandledEvent事件實現(xiàn),這篇文章給大家介紹Spring?Boot?如何通過ServletRequestHandledEvent事件實現(xiàn)接口請求的性能監(jiān)控,感興趣的朋友跟隨小編一起看看吧2024-08-08
簡單了解JAVA SimpleDateFormat yyyy和YYYY的區(qū)別
這篇文章主要介紹了簡單了解JAVA SimpleDateFormat yyyy和YYYY的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03
SpringBoot中使用com.alibaba.druid.filter.config.ConfigTools對數(shù)據(jù)庫
這篇文章主要介紹了SpringBoot中使用com.alibaba.druid.filter.config.ConfigTools對數(shù)據(jù)庫密碼加密的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01

