最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中的@Import注解四種使用方式詳解

 更新時(shí)間:2023年12月29日 11:03:26   作者:my_sky_  
這篇文章主要介紹了SpringBoot中的@Import注解四種使用方式詳解,@Import注解只可以標(biāo)注在類上,可以結(jié)合 @Configuration注解、ImportSelector、ImportBeanDefinitionRegistrar一起使用,也可以導(dǎo)入普通的類,需要的朋友可以參考下

@Import注解四種使用方式

在介紹 @Import注解的使用之前,我們先看源碼:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
   /**
    * {@link Configuration @Configuration}, {@link ImportSelector},
    * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import.
    */
   Class<?>[] value();
}

從注釋來(lái)看,@Import注解只可以標(biāo)注在類上,可以結(jié)合 @Configuration注解、ImportSelector、ImportBeanDefinitionRegistrar一起使用,也可以導(dǎo)入普通的類。

因此,@Import的使用方式有4種:直接導(dǎo)入類,導(dǎo)入配置類來(lái)導(dǎo)入Bean,導(dǎo)入 ImportSelector 的實(shí)現(xiàn)類,導(dǎo)入 ImportBeanDefinitionRegister 的實(shí)現(xiàn)類。

需要注意的是:ImportSelector、ImportBeanDefinitionRegistrar 這兩個(gè)接口都必須依賴于 @Import 一起使用,而 @Import 可以單獨(dú)使用。

我們熟悉的 @EnableAsync 、@EnableCaching、@EnableScheduling 等都是借助 @Import 注解來(lái)實(shí)現(xiàn)的。

需要導(dǎo)入的類

public class Hello {
	private String msg;
	
    public void print() {
    	if (msg != null) {
    		System.out.println(msg);
    	} else {
    		System.out.println("hello word");
    	}
    }
}

1、直接導(dǎo)入類

@Import(Hello.class)
public class SpringTestApplication {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringTestApplication.class);
        Hello hello = applicationContext.getBean(Hello.class);
        hello.print();
    }
}

項(xiàng)目中常用的方式如下:

@Import(Hello.class)
@Configuration
public class Config { 
}

2、導(dǎo)入配置類來(lái)導(dǎo)入Bean

@Configuration
public class HelloConfiguration {
    @Bean
    public Hello createHello() {
        return new Hello();
    }
}
@Import(HelloConfiguration.class)
public class SpringTestApplication {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringTestApplication.class);
        Hello hello = applicationContext.getBean(Hello.class);
        hello.print();
    }
}

這種方式使用較少,只要把配置類放到能被掃描到的包下,就可以去掉 @Import 導(dǎo)入。這種方式的使用場(chǎng)景是配置類無(wú)法被掃描到。

3、導(dǎo)入 ImportSelector 實(shí)現(xiàn)類

ImportSelector是一個(gè)接口,實(shí)現(xiàn)這個(gè)接口需要重寫(xiě)selectImports方法。selectImports方法會(huì)返回一個(gè)String數(shù)組,它包含的元素是需要被導(dǎo)入到容器中的類的全限定名。

下面我們實(shí)現(xiàn) ImportSelector 接口并重寫(xiě) selectImports 方法,將Hello類的全限定名返回。

public class HelloImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        List list = new ArrayList<>();
        list.add("a.b.domain.Hello");
        return StringUtils.toStringArray(list);
    }
}
@Import(HelloImportSelector.class)
public class SpringTestApplication {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringTestApplication.class);
        Hello hello = applicationContext.getBean(Hello.class);
        hello.print();
    }
}

上面是導(dǎo)入指定的類,ImportSelector 還可以實(shí)現(xiàn)根據(jù)條件導(dǎo)入某個(gè)類,例如 @EnableAsync 可以根據(jù)屬性mode來(lái)選擇實(shí)現(xiàn)代理的方式。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AsyncConfigurationSelector.class)
public @interface EnableAsync {
	Class<? extends Annotation> annotation() default Annotation.class;
	boolean proxyTargetClass() default false;
	AdviceMode mode() default AdviceMode.PROXY;
	int order() default Ordered.LOWEST_PRECEDENCE;
}
public class AsyncConfigurationSelector extends AdviceModeImportSelector {
	private static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME =
			"org.springframework.scheduling.aspectj.AspectJAsyncConfiguration";
	@Override
	@Nullable
	public String[] selectImports(AdviceMode adviceMode) {
		switch (adviceMode) {
			case PROXY:
				return new String[] {ProxyAsyncConfiguration.class.getName()};
			case ASPECTJ:
				return new String[] {ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME};
			default:
				return null;
		}
	}
}
public abstract class AdviceModeImportSelector implements ImportSelector {
	...
}

像這種還不能決定注入哪個(gè)類,就可以實(shí)現(xiàn)此接口,根據(jù)條件或配置來(lái)注入合適的處理類。

4、導(dǎo)入 ImportBeanDefinitionRegistrar 實(shí)現(xiàn)類

當(dāng)類實(shí)現(xiàn)了 ImportBeanDefinitionRegistrar 接口,就可以拿到注冊(cè)器,可以向容器中注冊(cè)任何的Bean,并且可以對(duì)Bean添加屬性。

public class HelloImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Hello.class)
                .addPropertyValue("msg", "test")
                .getBeanDefinition();
        registry.registerBeanDefinition("hello", beanDefinition);
    }
}
@Import(HelloImportBeanDefinitionRegistrar.class)
public class SpringTestApplication {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringTestApplication.class);
        Hello hello = applicationContext.getBean(Hello.class);
        hello.print();
    }
}

到此這篇關(guān)于SpringBoot中的@Import注解四種使用方式詳解的文章就介紹到這了,更多相關(guān)@Import注解四種使用方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis中的limit參數(shù)解讀

    mybatis中的limit參數(shù)解讀

    這篇文章主要介紹了mybatis中的limit參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java字符串的intern方法有何奧妙之處

    Java字符串的intern方法有何奧妙之處

    intern() 方法返回字符串對(duì)象的規(guī)范化表示形式。它遵循以下規(guī)則:對(duì)于任意兩個(gè)字符串 s 和 t,當(dāng)且僅當(dāng) s.equals(t) 為 true 時(shí),s.intern() == t.intern() 才為 true
    2021-10-10
  • springmvc使用JSR-303進(jìn)行數(shù)據(jù)校驗(yàn)實(shí)例

    springmvc使用JSR-303進(jìn)行數(shù)據(jù)校驗(yàn)實(shí)例

    本篇文章主要介紹了詳解springmvc使用JSR-303進(jìn)行數(shù)據(jù)校驗(yàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • 在Eclipse中運(yùn)行Solr 基礎(chǔ)知識(shí)

    在Eclipse中運(yùn)行Solr 基礎(chǔ)知識(shí)

    Solr我還是個(gè)菜鳥(niǎo),寫(xiě)這一些文章只是記錄一下最近一段時(shí)間學(xué)習(xí)Solr的心得,望各位同仁不要見(jiàn)笑,還希望多多指點(diǎn)
    2012-11-11
  • Java并發(fā)的CAS原理與ABA問(wèn)題的講解

    Java并發(fā)的CAS原理與ABA問(wèn)題的講解

    今天小編就為大家分享一篇關(guān)于Java并發(fā)的CAS原理與ABA問(wèn)題的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Kotlin協(xié)程與并發(fā)深入全面講解

    Kotlin協(xié)程與并發(fā)深入全面講解

    Android官方對(duì)協(xié)程的定義-協(xié)程是一種并發(fā)設(shè)計(jì)模式,您可以在Android平臺(tái)上使用它來(lái)簡(jiǎn)化異步執(zhí)行的代碼。協(xié)程是在版本1.3中添加到Kotlin的,它基于來(lái)自其他語(yǔ)言的既定概念
    2022-11-11
  • Java中的ConcurrentHashMap集合源碼解析

    Java中的ConcurrentHashMap集合源碼解析

    這篇文章主要介紹了Java中的ConcurrentHashMap集合源碼解析,ConcurrentHashMap底層容器和HashMap相同,同樣是Node數(shù)組+鏈表+紅黑樹(shù),不同的是在原來(lái)的基礎(chǔ)之上使用了Synchronized+CAS來(lái)保證線程安全,下面我們來(lái)進(jìn)行源碼分析,需要的朋友可以參考下
    2023-11-11
  • Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)的方法示例

    Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)的方法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了java針對(duì)Excel的讀寫(xiě)及數(shù)據(jù)庫(kù)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • Spring的DI依賴注入詳解

    Spring的DI依賴注入詳解

    這篇文章主要為大家介紹了Spring的DI依賴注入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • Java設(shè)計(jì)模塊系列之書(shū)店管理系統(tǒng)單機(jī)版(三)

    Java設(shè)計(jì)模塊系列之書(shū)店管理系統(tǒng)單機(jī)版(三)

    這篇文章主要為大家詳細(xì)介紹了Java單機(jī)版的書(shū)店管理系統(tǒng)設(shè)計(jì)模塊和思想第三章,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評(píng)論

肥东县| 报价| 德庆县| 汶上县| 含山县| 宕昌县| 巩留县| 静乐县| 池州市| 台湾省| 张家界市| 文昌市| 丽江市| 黄浦区| 手游| 桐柏县| 辽中县| 崇明县| 武宣县| 英德市| 嘉兴市| 分宜县| 泊头市| 谢通门县| 化德县| 德州市| 广元市| 广州市| 岗巴县| 凤山市| 游戏| 彭山县| 昌乐县| 正定县| 新安县| 盱眙县| 固安县| 江永县| 贞丰县| 大连市| 阿拉善右旗|