咱們能夠將一些bean組件交由Spring管理,而且Spring支持單實例bean和多實例bean。咱們本身寫的類,能夠經過包掃描+標註註解(@Controller、@Servcie、@Repository、@Component)的形式將其註冊到IOC容器中,若是不是咱們本身寫的類,好比,咱們在項目中引入了一些第三方的類庫,此時,咱們須要將這些第三方類庫中的類註冊到Spring容器中,該怎麼辦呢?此時,咱們就可使用@Bean和@Import註解將這些類快速的導入Spring容器中。接下來,咱們來一塊兒探討下如何使用@Import註解給容器中快速導入一個組件。java
項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotationgit
向Spring容器中註冊bean一般有如下幾種方式:github
Spring 3.0以前,建立Bean能夠經過xml配置文件與掃描特定包下面的類來將類注入到Spring IOC容器內。而在Spring 3.0以後提供了JavaConfig的方式,也就是將IOC容器裏Bean的元信息以java代碼的方式進行描述。咱們能夠經過@Configuration與@Bean這兩個註解配合使用來將原來配置在xml文件裏的bean經過java代碼的方式進行描述spring
@Import註解提供了@Bean註解的功能,同時還有xml配置文件裏
先看一下@Import註解的源碼:bash
@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能夠配合 Configuration
, ImportSelector
, ImportBeanDefinitionRegistrar
來使用,下面的or表示也能夠把Import當成普通的Bean使用。微信
@Import只容許放到類上面,不能放到方法上。下面咱們來看具體的使用方式。學習
@Import註解的三種用法主要包括:測試
注意:咱們先來看第一種方法:直接填class數組的方式,其餘的兩種方式咱們後面繼續講。code
首先,咱們建立一個Department類,這個類是一個空類,沒有成員變量和方法,以下所示。
package io.mykit.spring.plugins.register.bean; /** * @author binghe * @version 1.0.0 * @description 測試@Import註解的bean */ public class Department { }
接下來,咱們先在SpringBeanTest類中建立testAnnotationConfig7()方法,輸出Spring容器中全部的bean,來查看是否存在Department類對應的bean實例,以此來判斷Spring容器中是否註冊有Department類對應的bean實例。
@Test public void testAnnotationConfig7(){ ApplicationContext context = new AnnotationConfigApplicationContext(PersonConfig2.class); String[] names = context.getBeanDefinitionNames(); Arrays.stream(names).forEach(System.out::println); }
運行SpringBeanTest類的testAnnotationConfig7()方法,輸出的結果信息以下所示。
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 personConfig2 person binghe001
能夠看到Spring容器中並無Department類對應的bean實例。
咱們在PersonConfig2類上添加@Import註解,並將Department類標註到註解中,以下所示。
@Configuration @Import(Department.class) public class PersonConfig2 {
此時,咱們再次運行SpringBeanTest類的testAnnotationConfig7()方法,輸出的結果信息以下所示。
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 personConfig2 io.mykit.spring.plugins.register.bean.Department person binghe001
能夠看到,輸出結果中打印了io.mykit.spring.plugins.register.bean.Department,說明使用@Import導入bean時,id默認是組件的全類名。
@Import註解支持同時導入多個類,例如,咱們再次建立一個Employee類,以下所示。
package io.mykit.spring.plugins.register.bean; /** * @author binghe * @version 1.0.0 * @description 測試@Import註解的bean */ public class Employee { }
接下來,咱們也將Employee類添加到@Import註解中,以下所示。
@Configuration @Import({Department.class, Employee.class}) public class PersonConfig2 {
此時,咱們再次運行SpringBeanTest類的testAnnotationConfig7()方法,輸出的結果信息以下所示。
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 personConfig2 io.mykit.spring.plugins.register.bean.Department io.mykit.spring.plugins.register.bean.Employee person binghe001
能夠看到,結果信息中同時輸出了io.mykit.spring.plugins.register.bean.Department和io.mykit.spring.plugins.register.bean.Employee,說明Department類的bean實例和Employee類的bean實例都導入到Spring容器中了。
好了,我們今天就聊到這兒吧!別忘了給個在看和轉發,讓更多的人看到,一塊兒學習一塊兒進步!!
項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation
若是以爲文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公衆號,跟冰河學習Spring註解驅動開發。公衆號回覆「spring註解」關鍵字,領取Spring註解驅動開發核心知識圖,讓Spring註解驅動開發再也不迷茫。