中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Framework中@Import組件如何使用

發布時間:2021-08-12 14:29:45 來源:億速云 閱讀:135 作者:Leah 欄目:開發技術

Spring Framework中@Import組件如何使用,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

@Import 注冊普通Bean

使用@Import注冊一個普通Bean,只需要在@Import注解中指定待注冊Bean的class即可

/**
 * 使用Import注解,注冊一個普通的Bean
 */
@Data
public class TestImport {
    private String id = "@Import";
}

在spring啟動引導類中,添加@Import注解

/**
 * spring 容器啟動引導類
 */
@Import(TestImport.class)
public class TestImportBootstrap {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(TestImportBootstrap.class);
        System.out.println("context id : " + applicationContext.getId());
        String[] beanNames = applicationContext.getBeanNamesForType(TestImport.class);
        System.out.println("Bean Name is : " + Arrays.toString(beanNames));
        TestImport bean = applicationContext.getBean(TestImport.class);
        System.out.println("TestImport bean : " + bean);
        applicationContext.close();
    }
}

spring容器啟動后,控制臺打印的結果:

context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c
Bean Name is : [com.spring.study.ioc.register.TestImport]
TestImport bean : TestImport(id=@Import)

通過簡單使用@Import注解,便可以將一個普通的javaBean注冊到spring容器中。并且我們可以看到,通過@Import注解默認注冊的組件名稱為該javaBean的全類名

@Import 導入 配置類

使用@Import注解導入配置類,就會將配置類中的所有組件注冊到spring容器中。在spring中,并不是@Configuration標注的類才是配置類,但是被@Configuration標注的類會被生成代理對象,spring注入時與不使用@Configuration注解有很大區別,后續會單獨說明此處內容,本文不在贅述。

/**
 * spring組件配置類
 */
//@Configuration 使用@Import導入時,此注解可以不加
public class TestConfiguration {
    @Bean
    public TestImport testImport() {
        return new TestImport();
    }

    @Bean
    public TestImport testImport2() {
        return new TestImport();
    }
}

@Import注解中指定待導入的配置類

/**
 * spring 容器啟動引導類
 */
@Import(TestConfiguration.class)
public class TestImportBootstrap {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(TestImportBootstrap.class);
        System.out.println("context id : " + applicationContext.getId());
        String[] beanNames = applicationContext.getBeanNamesForType(TestImport.class);
        System.out.println("Bean Name is : " + Arrays.toString(beanNames));
        TestImport bean = (TestImport) applicationContext.getBean("testImport");
        System.out.println("TestImport bean : " + bean);
        applicationContext.close();
    }
}

spring容器啟動后,配置類中的注解同樣會被注冊到spring容器中:

context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c
Bean Name is : [testImport, testImport2]
TestImport bean : TestImport(id=@Import)

由結果可以看出,此時注冊的組件名稱即為配置類中指定的組件名稱,并且通過配置類,可以一次導入多個組件。

@Import 通過ImportSelector 注冊

ImportSelector接口中只定義了一個接口selectImports,通過此接口返回需要注冊的JavaBean的全類名數組,在使用@Import導入時,會將接口返回的所有類注冊到spring容器中

/**
 * 通過 ImportSelector 接口注冊組件
 */
@Data
public class TestSelector {
    private String id = "@Import:ImportSelector";
}

自定義實現ImportSelector接口

/**
 * 自定義組件選擇器,通過返回需要注冊的bean的全類名,進行快速的在IOC容器中注冊組件
 */
public class CustomImportSelector implements ImportSelector {

    /**
     * @param importingClassMetadata 標注了@Import配置類上面所有的注解信息
     */
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{TestSelector.class.getName()};
    }
}

@Import注解中指定ImportSelector實現類

/**
 * spring 容器啟動引導類
 */
@Import(CustomImportSelector.class)
public class TestImportBootstrap {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(TestImportBootstrap.class);
        System.out.println("context id : " + applicationContext.getId());
        TestSelector bean = applicationContext.getBean(TestSelector.class);
        System.out.println("TestSelector bean : " + bean);
        String[] beanNames = applicationContext.getBeanNamesForType(TestSelector.class);
        System.out.println("bean names:" + Arrays.asList(beanNames));
        applicationContext.close();
    }
}

spring容器啟動后,控制臺打印的結果:

context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@238e0d81
TestSelector bean : TestSelector(id=@Import:ImportSelector)
bean names:[com.spring.study.ioc.register.TestSelector]

由結果可以看出,TestSelector被注冊到了spring容器中。與前面的直接注冊相比,并沒有看出ImportSelector接口的突出特性。本文只是簡單的說明ImportSelector接口具有注冊組件的功能,對于spring容器在啟動時,如何執行BeanDefinitionRegistryPostProcessor來調用selectImports方法;如何使用ImportSelector接口實現更復雜的注冊功能,將在后續文章中深入理解。

@Import 通過ImportBeanDefinitionRegistrar 注冊

ImportBeanDefinitionRegistrar接口中只定義了一個registerBeanDefinitions方法,在此方法中,可以獲取到BeanDefinitionRegistry對象,利用此對象,即可手動將需要的組件注冊的spring容器中。在使用BeanDefinitionRegistry對象時,還可以指定組件在spring容器中注冊的bean名稱。

/**
 * 通過 ImportBeanDefinitionRegistrar 接口手動注冊組件
 */
@Data
public class TestRegistrar {
    private String id = "@Import:TestRegistrar";
}

自定義實現ImportBeanDefinitionRegistrar接口

/**
 * 手動注冊組件到IOC容器中
 */
public class CustomImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     * @param importingClassMetadata 標注了@Import配置類上面所有的注解信息
     * @param registry               BeanDefinition注冊器,可以通過此registry手動的向容器中注冊指定的組件
     */
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        if (!registry.containsBeanDefinition("testRegistrar")) {
            BeanDefinition definition = new RootBeanDefinition(TestRegistrar.class);
            registry.registerBeanDefinition("testRegistrar", definition);
        }
    }
}

@Import 注解中指定ImportBeanDefinitionRegistrar實現類

/**
 * spring 容器啟動引導類
 */
@Import(CustomImportBeanDefinitionRegistrar.class)
public class TestImportBootstrap {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(TestImportBootstrap.class);
        System.out.println("context id : " + applicationContext.getId());
        TestRegistrar bean = applicationContext.getBean(TestRegistrar.class);
        System.out.println("TestRegistrar bean : " + bean);
        String[] beanNames = applicationContext.getBeanNamesForType(TestSelector.class);
        System.out.println("bean names:" + Arrays.asList(beanNames));
        applicationContext.close();
    }
}

spring容器啟動后,控制臺打印的結果:

context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@238e0d81
TestRegistrar bean : TestRegistrar(id=@Import:TestRegistrar)
bean names:[testRegistrar]

由此可以看出,TestRegistrar被注冊到了spring容器中。與ImportSelector接口一樣,在spring容器啟動時,通過BeanDefinitionRegistryPostProcessor來執行接口方法。

@Import同時指定多種接口注冊

上面的例子中分別說明了使用@Import,通過直接導入Bean class,配置類,ImportSelector接口,ImportBeanDefinitionRegistrar接口來向spring容器中注冊組件。當然在使用@Import注解時,可以同時指定上面的任意幾種方式進行注冊

/**
 * spring 容器啟動引導類
 *
 * @author TangFD
 * @since 2019/6/25.
 */
@Import({
        TestComponent.class,
        TestConfiguration.class,
        CustomImportSelector.class,
        CustomImportBeanDefinitionRegistrar.class
})
public class TestImportBootstrap {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(TestImportBootstrap.class);
        System.out.println("context id : " + applicationContext.getId());
        String[] beanNames = applicationContext.getBeanDefinitionNames();
        System.out.println("bean names:" + Arrays.asList(beanNames));
        applicationContext.close();
    }
}

spring容器啟動后,控制臺打印的結果:

context id : org.springframework.context.annotation.AnnotationConfigApplicationContext@238e0d81
bean names:[org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, org.springframework.context.event.internalEventListenerProcessor, org.springframework.context.event.internalEventListenerFactory, testImportBootstrap, com.spring.study.ioc.register.TestComponent, com.spring.study.ioc.register.TestConfiguration, testImport, testImport2, com.spring.study.ioc.register.TestSelector, testRegistrar]

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

砀山县| 万年县| 宜阳县| 墨脱县| 温州市| 济阳县| 积石山| 弥勒县| 湖南省| 固镇县| 西宁市| 江油市| 高阳县| 平谷区| 昌乐县| 高青县| 万盛区| 河北区| 客服| 阿拉善盟| 云阳县| 镇安县| 法库县| 乐陵市| 阳信县| 石屏县| 六枝特区| 山阳县| 祁连县| 万源市| 旬阳县| 吴旗县| 井研县| 云梦县| 孟州市| 高青县| 澳门| 清新县| 涟水县| 徐水县| 百色市|