天天看點

Spring IoC容器Spring IoC容器Spring IoC接口ApplicationContext重要實作類裝配Bean的方式

文章目錄

  • Spring IoC容器
  • Spring IoC接口
  • ApplicationContext重要實作類
  • 裝配Bean的方式

Spring IoC容器

前面說到要從Spring那裡得到好處就要将對象交給Spring管理。在Spring中,這些被管理的對象被稱為Bean,将Bean的建立和依賴關系交給Spring管理,我們就說對象被控制反轉(Inversion Of Controll, IoC)了,而容納這些Bean的容器則稱為Spring IoC容器。

既然要将對象(Bean)交給Spring IoC容器管理,那麼就要通過Spring定義的規則将對象存放到Spring IoC容器。Spring IoC容器的設計主要是基于BeanFactory和ApplicationContext兩個接口,其中ApplicationContext是BeanFactory的子接口之一,換句話說BeanFactory是Spring IoC容中存在的所定義的最底層接口,而ApplicationContext是其進階接口之一,并且對BeanFactory功能做了許多有用的擴充。在絕大部分的場景下,都會使用ApplicationContext作為Spring IoC容器。以下為簡要類圖:

Spring IoC容器Spring IoC容器Spring IoC接口ApplicationContext重要實作類裝配Bean的方式

Spring IoC接口

我們來看看BeanFactory接口中定義的方法:

Spring IoC容器Spring IoC容器Spring IoC接口ApplicationContext重要實作類裝配Bean的方式
  • getBean(..)

    方法用于從Spring IoC容器中擷取Bean,getBean方法有五個重載方法,帶有String參數的用于指定Bean的名稱,帶有Class參數的用于指定Bean的類型。若僅指定名稱(預設名稱為類名首字母小寫),則傳回的對象為Object,需要進行類型轉換;若僅指定類型,則傳回該類型的對象,而無需進行轉換。可以看出,僅指定類型的方法會存在使用父類類型無法準确獲得執行個體的異常,比如下面一段代碼:
    public interface Person {
        public void eat();
    }
    
    class Student implements Person{
        public void eat() {}
    }
    
    class Teacher implements Person{
        public void eat() {}
    }
               
    若通過

    getBean(Person.class)

    方法來擷取執行個體,那得到的是Student的執行個體呢還是Teacher的執行個體呢?無法判斷,是以就會抛出異常。
  • isSingleton(String)

    用于判斷是否為單例,如果為真,則該Bean在容器中是作為一個唯一單例存在的。即不管調用幾次

    getBean("student")

    方法擷取Student的執行個體都是同一個對象。
  • isPrototype(String)

    則與

    isSingleton(String)

    相反,每次擷取Bean都是一個新的執行個體。
  • getAliases(String)

    方法是擷取别名的方法。

ApplicationContext重要實作類

ApplicationContext接口有兩個重要的實作類,ClassPathXmlApplicationContext和AnnotationConfigApplicationContext,分别用于從xml檔案中讀取Bean配置和從注解讀取Bean配置。以下為類圖:

Spring IoC容器Spring IoC容器Spring IoC接口ApplicationContext重要實作類裝配Bean的方式

裝配Bean的方式

  1. 通過注解裝配Bean
    • @Component注解
    • @Bean注解
    • @Autowired自動裝配
  2. 通過XML檔案配置裝配Bean
    • 通過構造器裝配
    • 通過屬性裝配
  3. 注解和XML檔案混合裝配

下一篇——使用注解裝配Bean

繼續閱讀