亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring @Import注解的使用

 更新時間:2021年05月14日 11:52:53   作者:口袋里的貓  
@Import注解算是SpringBoot自動配置原理中一個很重要的注解,本文介紹了該注解的源碼分析及使用方法,感興趣的朋友可以了解下

認識@Import注解

先看一下源碼

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {

	/**
	 * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
	 * or regular component classes to import.
	 */
	Class<?>[] value();

}

@Import表示要導(dǎo)入的一個或多個@Configuration類

看注釋value通常是一個普通的組件,Configuration,ImportSelector,ImportBeanDefinitionRegistrar。

搭建項目結(jié)構(gòu)用于測試

  • 先創(chuàng)建一個maven工程
  • 加入依賴
<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.18</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.24.RELEASE</version>
    </dependency>
</dependencies>

編寫測試代碼
Tom.java

@Data
public class Tom {
    private String color;
    private Integer age;
}

AppConfig.java

@Configuration
public class AppConfig {
}

App.java

public class App {
    public static void main(String[] args) {
        // 創(chuàng)建容器
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        // 獲取bean
        Tom tom = context.getBean(Tom.class);
        System.out.println(tom);
    }
}

@Import用法

第一種普通組件
@Import({ 要導(dǎo)入的容器中的組件 } )

CustomConfiguration.java

@Configuration
public class CustomConfiguration {
    @Bean
    public Tom tom() {
        Tom tom = new Tom();
        tom.setAge(11);
        tom.setColor("紅色");
        return tom;
    }
}

將AppConfig.java加上@Import({ CustomConfiguration.class })

@Import({ CustomConfiguration.class })
@Configuration
public class AppConfig {
}

這個時候運行App已經(jīng)可以獲取到Tom

第二種ImportSelector
CustomSelector.java

public class CustomSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[] { "com.moli.pojo.Tom" };
    }
}

將AppConfig.java加上@Import({ CustomRegistrar.class })

@Import({ CustomRegistrar.class })
@Configuration
public class AppConfig {
}

這個時候運行App已經(jīng)可以獲取到Tom

第三種ImportBeanDefinitionRegistrar
CustomRegistrar.java

public class CustomRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(Tom.class);
        builder.setScope(BeanDefinition.SCOPE_SINGLETON);
        builder.addPropertyValue("color", "灰色");
        builder.addPropertyValue("age", "12");
        registry.registerBeanDefinition("tom", builder.getBeanDefinition());
    }
}

將AppConfig.java加上@Import({ CustomSelector.class })

@Import({ CustomSelector.class })
@Configuration
public class AppConfig {
}

這個時候運行App已經(jīng)可以獲取到Tom

最佳搭檔 - @Import通用形式

在開源軟件中大部分@Import中是伴隨著一個@EnableXXX使用的

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({ CustomRegistrar.class })
public @interface EnableTom {
}

將AppConfig.java加上@EnableTom

@EnableTom
@Configuration
public class AppConfig {
}

這樣看起來,是不是有那味了。

其實SpringBoot的自動配置就是@Import的一個應(yīng)用

@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    ...
}

總結(jié)

直白一點使用@Import注解可以快速把實例加入Spring的IOC容器中

其實這三種用法也算是一種用法,就是導(dǎo)入一個類到容器,容器根據(jù)類的注解類型等信息對不同類進行不同處理;

方法一:導(dǎo)入一個Configuration組件,組件創(chuàng)建了一個Tom類的Bean;

方法二:CustomSelector返回的類的全限定類名,實際上要導(dǎo)入到容器中的組件全類名;

方法三:ImportBeanDefinitionRegistrar類似于第二種ImportSelector用法,只不過這種用法能自定義化注冊,往容器內(nèi)注入一個BeanDefinition,然后BeanDeiniton在容器內(nèi)轉(zhuǎn)為一個實例bean;

以上就是Spring @Import注解的使用的詳細內(nèi)容,更多關(guān)于Spring @Import注解的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Maven profile配置管理及激活profile的幾種方式

    詳解Maven profile配置管理及激活profile的幾種方式

    這篇文章主要介紹了詳解Maven profile配置管理及激活profile的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2021-01-01
  • Java的帶GUI界面猜數(shù)字游戲的實現(xiàn)示例

    Java的帶GUI界面猜數(shù)字游戲的實現(xiàn)示例

    這篇文章主要介紹了Java的帶GUI界面猜數(shù)字游戲的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-12-12
  • 使用JSONObject.toJSONString 過濾掉值為空的key

    使用JSONObject.toJSONString 過濾掉值為空的key

    這篇文章主要介紹了使用JSONObject.toJSONString 過濾掉值為空的key,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺談TreeSet中的兩種排序方式

    淺談TreeSet中的兩種排序方式

    下面小編就為大家?guī)硪黄獪\談TreeSet中的兩種排序方式。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • MyBatis注解開發(fā)之實現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢

    MyBatis注解開發(fā)之實現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢

    本文主要詳細介紹了MyBatis注解開發(fā)中,實現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢,文中有詳細的代碼示例,對學(xué)習MyBatis有一定的參考價值,需要的朋友可以參考閱讀
    2023-04-04
  • Spring整合Mybatis思路梳理總結(jié)

    Spring整合Mybatis思路梳理總結(jié)

    mybatis-plus是一個 Mybatis 的增強工具,在 Mybatis 的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Mybatis-plus案例及用法實例的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Spring動態(tài)數(shù)據(jù)源實現(xiàn)讀寫分離詳解

    Spring動態(tài)數(shù)據(jù)源實現(xiàn)讀寫分離詳解

    這篇文章主要為大家詳細介紹了Spring動態(tài)數(shù)據(jù)源實現(xiàn)讀寫分離,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java實現(xiàn)微信掃碼登入的實例代碼

    Java實現(xiàn)微信掃碼登入的實例代碼

    這篇文章主要介紹了java實現(xiàn)微信掃碼登入功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 詳解如何用spring Restdocs創(chuàng)建API文檔

    詳解如何用spring Restdocs創(chuàng)建API文檔

    這篇文章將帶你了解如何用spring官方推薦的restdoc去生成api文檔。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java中的包(package)是什么和使用方法

    Java中的包(package)是什么和使用方法

    包是Java中一種強大的組織代碼的工具,它們幫助開發(fā)者將代碼分組,防止命名沖突,并通過控制訪問級別來增強代碼的安全性,這篇文章主要介紹了Java中的包(package)是什么和如何使用它們,需要的朋友可以參考下
    2024-07-07

最新評論