<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之旅 廣告
                [TOC] ### Bean概述 一個Spring Ioc容器管理一個或多個Beans。Beans由你提供給容器的配置元數據創建的,如XML格式的\<bean/>定義。 在容器內部,bean定義由 *BeanDefinition* 對象表示,它包含以下信息(以及其他信息): - 包限定類名:通常是定義bean的實際實現類 - Bean行為配置元素,它們表明bean在容器內部的行為(作用域,生命周期回調等等) - Bean工作所需要的其他Bean的引用;這些引用也稱為合作者或依賴 - 在創建新對象時設置的其他配置信息,如在一個Bean中可以使用的管理連接池的連接數量,或者連接池自身的數量限制。 元數據轉換成構成每個Bean定義的屬性集。 表一 bean定義 | 屬性 | 解釋模塊 | | --- | --- | | class | 實例化Beans | | name | Beans命名 | | scope | Bean作用域 | | constructor arguments | 依賴注入 | | properties | 依賴注入 | | autowiring mode | 自動裝配依賴 | | lazy-initialization mode | 懶初始化Beans | | initialization method | 初始化回調 | | destruction method | 銷毀回調 | 除了包含如何創建特定bean的信息的bean定義之外,*ApplicationContext* 實現還允許用戶注冊在容器外部創建的現有對象。這是通過 *getBeanFactory()* 方法訪問 *ApplicationContext* 的*BeanFactory*來完成的,該方法返回 *BeanFactoryd* 的實現 *DefaultListableBeanFactory* 。 *DefaultListableBeanFactory* 通過方法 *registerSingleton(..)* 和 *registerBeanDefinition(..)* 來支持這種注冊。但是,通常的應用程序只能通過元數據bean定義來定義bean。 Bean元數據和手動提供的單實例需要盡早注冊,以便容器在自動裝配和其他自省步驟中正確推理它們。雖然重寫現有的元數據和現有的單實例在某種程度上受到支持,但在運行時(與實時訪問工廠同時)注冊新的Bean并未得到正式支持,并且可能導致并發訪問異常或bean容器中的狀態不一致。 #### 1.3.1. Beans命名 每個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生成一個唯一name。但是,如果您想通過name引用,或者通過使用 *ref* 元素或 *Service Locator* 樣式查找該bean,您必須提供一個name。不提供name的動機與使用inner beans和自動裝配依賴有關。 >:-: **Bean命名約定** > >約定是在命名bean時使用標準Java約定作為實例字段名稱。也就是說,bean名稱以小寫字母開頭,并且后面的字符以駝峰命名法為基礎。例如這樣的name(不帶引號)'accountManager','accountService','userDao','loginController'等等。 >命名bean始終使您的配置更易于閱讀和理解,如果您使用的是Spring AOP,則將建議應用于與名稱相關的一組bean時會有很大幫助。 >[info] 通過在類路徑中的組件掃描,Spring 遵循上述規則為未命名組件生成 bean 名稱,: 基本上,使用簡單的類名并將其初始字符轉換為小寫。 然而,在(不尋常的)特殊情況下,如果有一個以上的字符,而且第一個和第二個字符都是大寫的,則使用原始的名稱。 這些和 java.beans.inseartor.disapitalize(Spring 使用的) 具有相同的規則。 ##### 在bean定義之外創建別名 在對bean定義時,除了使用id屬性指定一個唯一的名稱外,為了提供多個名稱,需要通過name屬性加以指定。所有這個名稱都指向同一個bean,在某些情況下提供別名非常有用,比如為了讓應用每一個組件都能更容易的對公共組件進行引用。 然而,在定義bean時就指定所有的別名并不總是很恰當。有時我們期望能夠在當前位置為那些在別處定義的bean引入別名。在XML配置文件中,可以通過 *\<alias/>* 元素來完成bean別名的定義,例如: ~~~xml <alias name="fromName" alias="toName"/> ~~~ 在這種情況下,如果同一容器中存在名為 *fromName* 的bean定義,在增加別名定義后,也可以用 *toName* 來引用。 例如,在子系統A中通過名字 *fsubsystemA-dataSource* 配置的數據源。在子系統B中可能通過名字 *fsubsystemB-dataSource*f 來引用。當兩個子系統構成主應用的時候,主應用可能通過名字 *fmyApp-dataSource*f 引用數據源,將全部三個名字引用同一個對象,你可以將下面的別名定義添加到應用配置中: ~~~xml <alias name="subsystemA-dataSource" alias="subsystemB-dataSource"/> <alias name="subsystemA-dataSource" alias="myApp-dataSource" /> ~~~ 現在每個子系統和主應用都可以通過唯一的名稱來引用相同的數據源,并且可以保證他們的定義不與任何其他的定義沖突。 >:-: **基于Java的配置** > >如果你想使用基于Java的配置,@Bean注解可以用來提供別名,詳細信息請看 **使用@Bean注解** 。 #### 1.3.2. 實例化bean bean定義基本上就是用來創建一個或多個對象的配方(recipe),當需要一個bean的時候,容器查看配方并且根據bean定義封裝的配置元數據創建(或獲取)一個實際的對象。 如果你使用基于XML的配置,你可以在 *\<bean/>* 元素通過class屬性來指定對象的類型。這個 *class* 屬性,實際上是 *BeanDefinition* 實例中的一個Class屬性。這個 *class* 屬性通常是必須的(例外情況,查看 **使用實例工廠方法實例化** 和 **Bean定義的繼承**),使用Class屬性的兩種方式: * 通常情況下,直接通過反射調用構造方法來創建bean,和在Java代碼中使用new有點像。 * 通過靜態工廠方法創建,類中包含靜態方法。通過調用靜態方法返回對象的類型可能和Class一樣,也可能完全不一樣。 >*內部類名* > >如果你想配置使用靜態的內部類,你必須用內部類的二進制名稱。 > >例如,在com.example包下有個Foo類,這里類里面有個靜態的內部類Bar,這種情況下bean定義的class屬性應該… > >com.example.Foo$Bar > >注意,使用$字符來分割外部類和內部類的名稱。 ##### 通過構造函數實例化 當你使用構造方法來創建bean的時候,Spring對class沒有特殊的要求。也就是說,正在開發的類不需要實現任何特定的接口或者以特定的方式進行編碼。但是,根據你使用那種類型的IoC來指定bean,你可能需要一個默認(無參)的構造方法。 Spring IoC 容器可以管理幾乎所有你想讓它管理的類,它不限于管理POJO。大多數Spring用戶更喜歡使用POJO(一個默認無參的構造方法和setter,getter方法)。但在容器中使用非bean形式(non-bean style)的類也是可以的。比如遺留系統中的連接池,很顯然它與JavaBean規范不符,但Spring也能管理它。 當使用基于XML的元數據配置文件,可以這樣來指定bean類: ~~~xml <bean id="exampleBean" class="examples.ExampleBean"/> <bean name="anotherExample" class="examples.ExampleBeanTwo"/> ~~~ 給構造方法指定參數以及為bean實例化設置屬性將在后面的依賴注入中詳細說明。 ##### 使用靜態工廠方法實例化 當采用靜態工廠方法創建bean時,除了需要指定 *class* 屬性外,還需要通過 *factory-method* 屬性來指定創建bean實例的工廠方法。Spring將調用此方法(其可選參數接下來介紹)返回實例對象,就此而言,跟通過普通構造器創建類實例沒什么兩樣。 下面的bean定義展示了如何通過工廠方法來創建bean實例。注意,此定義并未指定返回對象的類型,僅指定該類包含的工廠方法。在此例中,*createInstance()* 必須是一個static方法。 ~~~xml <bean id="clientService" class="examples.ClientService" factory-method="createInstance"/> ~~~ ~~~Java public class ClientService { private static ClientService clientService = new ClientService(); private ClientService() {} public static ClientService createInstance() { return clientService; } } ~~~ 給工廠方法指定參數以及為bean實例設置屬性的詳細內容請查閱依賴和配置詳解。 ##### 使用實例工廠方法實例化 與通過 *靜態工廠方法* 實例化類似,通過調用工廠實例的非靜態方法進行實例化。 使用這種方式時,*class*屬性必須為空,而*factory-bean*屬性必須指定為當前(或其祖先)容器中包含工廠方法的bean的名稱,而該工廠bean的工廠方法本身必須通過factory-method屬性來設定。 ~~~xml <!-- 工廠bean,包含createInstance()方法 --> <bean id="serviceLocator" class="examples.DefaultServiceLocator"> <!-- 其他需要注入的依賴項 --> </bean> <!-- 通過工廠bean創建的ben --> <bean id="clientService" factory-bean="serviceLocator" factory-method="createClientServiceInstance"/> ~~~ ~~~Java public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); private DefaultServiceLocator() {} public ClientService createClientServiceInstance() { return clientService; } } ~~~ 一個工廠類也可以有多個工廠方法,如下代碼所示: ~~~xml <bean id="serviceLocator" class="examples.DefaultServiceLocator"> <!-- 其他需要注入的依賴項 --> </bean> <bean id="clientService" factory-bean="serviceLocator" factory-method="createClientServiceInstance"/> <bean id="accountService" factory-bean="serviceLocator" factory-method="createAccountServiceInstance"/> ~~~ ~~~Java 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)進行管理配置。查看依賴和配置詳解。 >[info] 在Spring文檔中,*factory bean*是指在Spring容器中配置的工廠類通過 實例 或 靜態 工廠方法來創建對象。相比而言, *FactoryBean* (注意大小寫) 代表了Spring中特定的 FactoryBean.
                  <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>

                              哎呀哎呀视频在线观看