<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 4.3 Bean 概述 Spring 的 IoC 容器管理一個或多個 bean。這些 bean 通過提供給容器的配置元數據被創 建出來,比如,在 XML 中的`<bean/>`定義的形式。 在容器本身,這些 bean 代表了 BeanDefinition 對象,它們包含(在其它信息中) 下列元數據: 打包的類限定名:就是這些 bean 的真正實現類。 bean 的行為配置元素,這表示了 bean 在容器中(范圍,生命周期回調等等)應該是怎 樣的行為。 對其它 bean 的引用,這是該 bean 工作所需要的;這些引用通常被稱為合作者或依賴。 在新被創建的對象中的其它配置設置,比如,管理連接池的 bean 中使用的連接數或連 接池限制的大小。 元數據翻譯成一組屬性集合來構成每一個 bean 的定義。 表 4.1 bean 定義 | 屬性 | 解釋章節 | | --- | --- | | class | 4.3.2 節,“實例化 bean” | | name | 4.3.1 節,“命名 bean” | | scope | 4.5 節,“bean 的范圍” | | constructor arguments | 4.4.1 節,“依賴注入” | | properties | 4.4.1 節,“依賴注入” | | autowiring mode | 4.4.5 節,“裝配合作者” | | lazy-initialization mode | 4.4.4 節,“延遲初始化 bean” | | initialization method | 4.6.1.1 節,“初始化回調” | | descruction method | 4.6.1.2 節,“銷毀回調” | 此外,bean 的定義還包含如何創建特定 bean 的信息,ApplicationContext 的實現類允許用戶將容器外部創建的已有對象的注冊。這可以通過 getBeanFactory()方法訪問 ApplicationContext 的 BeanFactory 來完成 , 它 會 返 回 BeanFactory 的實現類 DefaultListableBeanFactory 。 DefaultListableBeanFactory 通 過 registerSingleton(..)和 registerBeanDefinition(..)方法來支持這種注冊。 而典型的應用程序只和通過元數據定義的 bean 來工作。 ### 4.3.1 命名 bean 每個 bean 有一個或者多個標識符。這些標識符必須在托管 bean 的容器內唯一。通常 一個 bean 只有一個標識符,但如果它需要多個的話,其它的可以被認為是別名。 在基于 XML 的配置元數據中,你可以使用 id 和/或 name 屬性來指定 bean 的標識符。 id 屬性允許你指定一個準確的 id。按照管理這些名稱是字母和數字(‘myBean’,‘fooService’ 等),但是可能是特殊字符。如果你想為 bean 引入別名,你也可以在 name 屬性中來指定, 通過逗號(,),分號(;)或空格來分隔。作為對歷史的說明,在 Spring 3.1 版之前,id 屬性 是 xsd:ID 類型,只限定為字符。在 3.1 版本中,現在是 xsd:string 類型了。要注意 bean 的 id 的唯一性還是被容器所強制的,但是對于 XML 處理器卻不是。 當然你也可以不給 bean 提供 name 或 id。如果沒有提供明確的 name 或 id,那么容器會為這個 bean 生成一個唯一的名稱。然而,如果你想通過名稱來參考這個 bean,那么可以 使用 ref 元素或者是服務定位器(4.15.2 節)風格的查找,你必須提供一個名稱。不提供名稱的動機是和使用內部 bean(4.4.2.3 節)或自動裝備合作者(4.4.5 節)相關的。 Bean 的命名約定 該約定是用于當命名 bean 時,對實例字段名稱的標準 Java 約定。也就是說,bean 的名稱以小寫字母開始,后面是駝峰形式的。這樣的命名可以是(沒有引號)‘accountManager’,‘accountService’,‘userDao’,‘loginController’ 等。 一致的命名 bean 可以使你的配置信息易于閱讀和理解,如果你使用 Spring 的 AOP, 當應用通知到一組相關名稱的 bean 時,它會給你很大的幫助。 #### 4.3.1.1 在 bean 定義外面起別名 在 bean 定義的本身,你可以為 bean 提供多于一個的名稱,使用一個由 id 屬性或 name 屬性中的任意名稱數指定的名稱組合。這些名稱對于同一個 bean 來說都是相等的別名,在 一些情況下,這是很有用的,比如在應用程序中允許每個組件參考一個共同的依賴,可以使 用為組件本身指定的 bean 的名稱。 然而,在 bean 定義時指定所有的別名是不夠的。有事可能想在任意位置,為一個 bean 引入一個別名。這在大型系統中是很常見的例子,其中的配置信息是分在每個子系統中的, 每個子系統都有它自己的對象定義集合。在基于 XML 的配置元數據中,你可以使用`<alias/>` 元素來完成這項工作。 ``` <alias name="fromName" alias="toName"/> ``` 在這個示例中,在相同容器中的名稱為 fromName 的 bean,在使用過這個別名定義后, 也可以使用 toName 來指引。 比如,在子系統的配置元數據中,A 可能要通過名稱‘subsystemA-dataSource’來指向 數據源。為子系統 B 的配置元數據可能要通過名稱‘subsystemB-dataSource’來指向數據源。 當處理使用了這兩個子系統的主程序時,主程序要通過名稱‘myApp-dataSource’來指向數 據源。那么就需要三個名稱指向同一個對象,那么就要按照下面的別名定義來進行添加 MyApp 的配置元數據: ``` <alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/> <alias name="subsystemA-dataSource" alias="myApp-dataSource" /> ``` 現在每個組件和主程序都可以通過一個唯一的保證不沖突的名稱來還有其它任意定義(更有效地是創建命名空間)來參照數據源了,當然它們參照的是同一個 bean。 ### 4.3.2 實例化 bean bean 的定義信息本質上是創建一個或多個對象的方子。當需要一個 bean 時,容器查找 這些方子來查找命名的 bean,并且使用由 bean 定義信息封裝的配置元數據來創建(或獲得) 一個真實的對象。 如果你使用基于 XML 的配置元數據,你為要被實例化的對象所指定的類型(或類)是 `<bean/>`元素中 class 屬性。這個 class 屬性,是 BeanDefinition 實例內部的 cla ss 屬性,通常是強制要有的。(對于特例,可以參考 4.3.2.3 節,“使用實例的工廠方法來實例化”和 4.7 節,“Bean 定義的繼承”)你可以以兩種方法之一來使用 class 屬性: 典型的是,指定要被構造的 bean 類,容器本身直接通過反射調用它的構造方法來創建bean,也就是和 Java 代碼中使用 new 操作符是相同的。 指定包含 static 工廠方法的真實的類,會被調用來創建對象,在一些不太常見的情況下,容器會調用類的 static 工廠方法來創建 bean。從調用 static 工廠方法返回的對象類型可能 是和另外一個類完全相同的類。 內部類名稱 如果你想為 static 嵌入的類配置 bean,你需要使用內部類的二進制名稱。 比如,如果在 com.example 包下有一個 Foo 類,而這個 Foo 類有一個 static 的內部類 Bar,那么在定義 bean 時’class’屬性的值就會是... ``` com.example.Foo$Bar ``` 請注意名稱中$符號的使用,用來從外部類名中分隔內部類名。 #### 4.3.2.1 使用構造方法實例化 當你使用構造方法來創建 bean 時,所有普通的類的使用都和 Spring 兼容。也就是說, 開發中的 bean 不需要實現任何特定的接口或以特定的方式來編碼。僅簡單指定 bean 的類 就足夠了。但基于你使用的是什么類型的 IoC,就可能需要一個默認(空的)構造方法。 Spring 的 IoC 容器可以虛擬地管理任意的你想讓它管理的類;而不僅僅限于管理真正的 JavaBean。很多 Spring 用戶喜歡在容器中使用有默認(無參數)構造方法和在其后有適當 setter 和 getter 方法的真正 JavaBean。你也可以在容器中使用很多異樣的,非 bean 樣式的類。比 如,需要使用遺留的連接池,但是它沒有符合 JavaBean 的規范,Spring 也能照樣管理它。 基于 XML 的配置元數據,你可以如下來定義 bean: ``` <bean id="exampleBean" class="examples.ExampleBean"/> <bean name="anotherExample" class="examples.ExampleBeanTwo"/> ``` 關于提供構造方法參數(如果需要)和在對象被構造后,設置對象實例屬性機制的詳情, 請參考 4.4.1 節依賴注入。 #### 4.3.2.2 使用靜態工廠方法來實例化 當使用靜態工廠方法來定義 bean 的時候,可以使用 class 屬性來指定包含 static 工廠 方法的類,而名為 factory-method 的屬性來指定靜態方法。你應該調用這個方法(還可 以有可選的參數)并返回一個實際的對象,隨后將它視為是通過構造方法創建的一樣。在遺留代碼中,這樣定義 bean 的使用方式之一是調用 static 工廠。 下面 bean 的定義指定了要通過調用工廠方法生成的 bean。這個定義沒有指定返回對象 的類型(類),僅僅是包含工廠方法的類。在本例中,createInstance()方法必須是靜 態方法。 ``` <bean id="clientService" class="examples.ClientService" factory-method="createInstance"/> public class ClientService { private static ClientService clientService = new ClientService(); private ClientService() {} public static ClientService createInstance() { return clientService; } } ``` 關于提供(可選的)參數到工廠方法并在對象由工廠返回后設置對象實例屬性的機制詳 情,請參考 4.4.2 節深入依賴和配置。 #### 4.3.2.3 使用實例工廠方法來實例化 和使用靜態工廠方法(4.3.2.2 節)實例化相似,使用實例工廠方法實例化是要調用容器 中已有 bean 的一個非靜態的方法來創建新的 bean。要使用這個機制,請把 class 屬性留 空,但在 factory-bean 屬性中指定當前(或父/祖先)容器中 bea n 的名字,該 bean 要 包含被調用來創建對象的實例方法。使用 factory-method 方法來設置工廠方法的名稱。 ``` <!-- 工廠bean,包含名為createInstance()的方法 --> <bean id="serviceLocator" class="examples.DefaultServiceLocator"> <!-- 為locator bean注入任意需要的依賴 --> </bean> <!-- 通過工廠bean來創建的bean --> <bean id="clientService" factory-bean="serviceLocator" factory-method="createClientServiceInstance"/> public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); private DefaultServiceLocator() {} public ClientService createClientServiceInstance() { return clientService; } } ``` 一個工廠類也可以有多于一個工廠方法,比如下面這個: ``` <bean id="serviceLocator" class="examples.DefaultServiceLocator"> <!--為locator bean注入任意需要的依賴 --> </bean> <bean id="clientService" factory-bean="serviceLocator" factory-method="createClientServiceInstance"/> <bean id="accountService" factory-bean="serviceLocator" factory-method="createAccountServiceInstance"/> public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); private static AccountService accountService = new AccountServiceImpl(); private DefaultServiceLocator() {} public ClientService createClientServiceInstance() { return clientService; } public AccountService createAccountServiceInstance() { return accountService; } } ``` 這個方法展示了工廠 bean 本身可以通過依賴注入(DI)被管理和配置。請參考 4.4.2 節 深入依賴和配置。 注意在 Spring 文檔中,工廠 bean 指的是在 Spring 容器中配置的 bean,可以通過實例(4.3.2.3節)或靜態(4.3.2.2 節)工廠方法來創建對象。與此相反的是,FactoryBean(注意大小寫)指的是 Spring 特定的 FactoryBean(4.8.3 節)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看