詳解Spring 注解之@Import 注入的各種花活
今天來分享一下 pig4cloud 中涉及的 @Import 的注入形式。通過不同形式的注入方式,最大程度使得架構(gòu)簡(jiǎn)潔。
@Import導(dǎo)入一個(gè)組件
來看 EnablePigxDynamicRoute 這個(gè)注解,當(dāng)我們需要開始動(dòng)態(tài)數(shù)據(jù)源時(shí),只需要在main 方法加上此注解即可。
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import(DynamicRouteAutoConfiguration.class) public @interface EnablePigxDynamicRoute { }
實(shí)際核心是引入 DynamicRouteAutoConfiguration 這個(gè)配置類,此類并未被Spring 掃描管理
寫個(gè)簡(jiǎn)單的例子
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 并未增加上文的聲明式注解,注入了一個(gè)全類型名稱的Bean
ImportSelector 接口
顧名思義導(dǎo)入的選擇器,當(dāng) @Import 引入的類是 ImportSelector 接口的實(shí)現(xiàn)時(shí),會(huì)按照此選擇器進(jì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
當(dāng)@Import 引入的是 ImportBeanDefinitionRegistrar 接口實(shí)現(xiàn)類,會(huì)自動(dòng)引入 registerBeanDefinitions 定義的Bean
以pig 的資源服務(wù)器配置設(shè)置,自動(dòng)引入了一個(gè) 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 { }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java設(shè)計(jì)模式之裝飾模式原理與用法實(shí)例詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之裝飾模式原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了裝飾模式的概念、原理、定義與使用方法,并總結(jié)分析了裝飾模式的優(yōu)缺點(diǎn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04springboot集成flyway自動(dòng)創(chuàng)表的詳細(xì)配置
Flayway是一款數(shù)據(jù)庫(kù)版本控制管理工具,支持?jǐn)?shù)據(jù)庫(kù)版本自動(dòng)升級(jí),Migrations可以寫成sql腳本,也可以寫在java代碼里;本文通過實(shí)例代碼給大家介紹springboot集成flyway自動(dòng)創(chuàng)表的詳細(xì)過程,感興趣的朋友一起看看吧2021-06-06關(guān)于jd-gui啟動(dòng)報(bào)This?program?requires?Java?1.8+的錯(cuò)誤問題及解決方法
最近,在Mac使用上JD-GUI啟動(dòng)時(shí)總是報(bào)錯(cuò),接下來通過本文給大家介紹關(guān)于jd-gui啟動(dòng)報(bào)this?program?requires?Java?1.8+的錯(cuò)誤問題及解決方法,需要的朋友可以參考下2022-05-05向Spring IOC 容器動(dòng)態(tài)注冊(cè)bean實(shí)現(xiàn)方式
這篇文章主要為大家介紹了向Spring IOC 容器動(dòng)態(tài)注冊(cè)bean實(shí)現(xiàn)方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07SpringBoot 2.6.x整合springfox 3.0報(bào)錯(cuò)問題及解決方案
這篇文章主要介紹了SpringBoot 2.6.x整合springfox 3.0報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01