<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # SpringBean 自動裝配 – `@Autowired` > [https://howtodoinjava.com/spring-core/spring-beans-autowiring-concepts/](https://howtodoinjava.com/spring-core/spring-beans-autowiring-concepts/) 在 Spring 框架中,遵循配置文件中的 bean 依賴關系是一種很好的做法,因此 Spring 容器能夠自動關聯 Bean 之間的關系。 這意味著可以通過檢查[`BeanFactory`](https://howtodoinjava.com/spring-core/different-spring-ioc-containers/)的內容來自動讓 Spring 為您的 bean 解決協作者(其他 bean)。 這稱為 SpringBean 自動裝配。 自動裝配功能具有四種模式。 這些是`no`,`byName`,`byType`和`constructor`。 另一種自動裝配模式[`autodetect`](https://docs.spring.io/spring/docs/upgrade/spring3/html/ch03s03.html)已廢棄。文檔說,`autodetect`選項提供了太多的“魔力”,因此首選更明確的聲明。 * XML 配置中的默認自動裝配模式為`no`。 * Java 配置中的默認自動裝配模式為`byType`。 ![Spring bean autowiring modes](https://img.kancloud.cn/0e/dc/0edc303d4a698580012ba1f6fdd21407_814x294.jpg) Spring bean 自動裝配模式 ## 1\. 自動裝配模式 如上圖所示,有五種自動裝配模式。 讓我們一一討論。 1. #### 沒有 該選項是 spring 框架的默認選項,這意味著自動裝配為`OFF`。 您必須使用 bean 定義中的`<property>`標簽顯式設置依賴項。 2. #### 按名字 此選項啟用基于 bean 名稱的依賴項注入。 在 Bean 中自動裝配屬性時,屬性名稱用于在配置文件中搜索匹配的 Bean 定義。 如果找到這樣的 bean,則將其注入屬性。 如果找不到這樣的 bean,則會引發錯誤。 > 閱讀更多: [按名字自動裝配示例](https://howtodoinjava.com/spring-core/spring-bean-autowire-byname/) 3. #### 按類型 此選項啟用基于 bean 類型的依賴項注入。 在 bean 中自動裝配屬性時,屬性的類類型用于在配置文件中搜索匹配的 bean 定義。 如果找到這樣的 bean,則將其注入屬性。 如果找不到這樣的 bean,則會引發錯誤。 > 閱讀更多:[按類型自動裝配示例](https://howtodoinjava.com/spring-core/spring-bean-autowire-bytype/) 4. #### 構造器 `constructor`的自動裝配與`byType`相似,但適用于構造函數參數。 在啟用自動裝配的 bean 中,它將查找構造函數參數的類類型,然后對所有構造函數參數執行自動裝配`bytype`。 請注意,如果容器中沒有一個完全屬于構造函數參數類型的 bean,則會引發致命錯誤。 > 閱讀更多:[通過構造器示例自動裝配](https://howtodoinjava.com/spring-core/spring-autowiring-by-constructor/) ## 2\. `@Autowired`注解 除了 bean 配置文件中提供的自動裝配模式外,還可以使用`@Autowired`注解在 bean 類中指定自動裝配。 要在 bean 類中使用`@Autowired`注解,必須首先使用以下配置在 spring 應用程序中啟用注解。 #### 2.1. 啟用注解配置 `applicationContext.xml` ```java <context:annotation-config /> ``` 使用配置文件中的`AutowiredAnnotationBeanPostProcessor` bean 定義可以實現相同的目的。 ```java <bean class ="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/> ``` #### 2.2. 使用`@Autowired`注解 現在,啟用注解配置后,您可以使用`@Autowired`隨意地自動綁定 bean 依賴項。 這可以通過三種方式完成: ##### 2.2.1. `@Autowired`屬性 在屬性上使用`@Autowired`時,等效于在配置文件中通過`byType`進行自動裝配。 `EmployeeBean.java` ```java public class EmployeeBean { @Autowired private DepartmentBean departmentBean; public DepartmentBean getDepartmentBean() { return departmentBean; } public void setDepartmentBean(DepartmentBean departmentBean) { this.departmentBean = departmentBean; } //More code } ``` ##### 2.2.2. 屬性設置器上的`@Autowired` 當在設置器上使用`@Autowired`時,它也等效于在配置文件中通過`byType`進行自動裝配。 `EmployeeBean.java` ```java public class EmployeeBean { private DepartmentBean departmentBean; public DepartmentBean getDepartmentBean() { return departmentBean; } @Autowired public void setDepartmentBean(DepartmentBean departmentBean) { this.departmentBean = departmentBean; } //More code } ``` ##### 2.2.3. 構造函數上的`@Autowired` 在 bean 的構造函數上使用`@Autowired`時,它也等效于在配置文件中通過`constructor`自動裝配。 `EmployeeBean.java` ```java package com.howtodoinjava.autowire.constructor; public class EmployeeBean { @Autowired public EmployeeBean(DepartmentBean departmentBean) { this.departmentBean = departmentBean; } private DepartmentBean departmentBean; public DepartmentBean getDepartmentBean() { return departmentBean; } public void setDepartmentBean(DepartmentBean departmentBean) { this.departmentBean = departmentBean; } //More code } ``` ## 3\. `@Qualifier`解決沖突 我們了解到,如果我們在`byType`模式下使用自動裝配,則會在依賴項中查找屬性類類型。 如果找不到這樣的類型,則會引發錯誤。 但是,如果有**兩個或更多相同類類型**的 bean,該怎么辦。 在這種情況下,spring 將無法選擇正確的 bean 來注入屬性,因此您將需要使用限定符來幫助容器。 要使用限定符解析特定的 bean,我們需要將`@Qualifier`注解與`@Autowired`注解一起使用,并將 bean 名稱傳遞到注解參數中。 看看下面的例子: `EmployeeBean.java` ```java public class EmployeeBean { @Autowired @Qualifier("finance") private DepartmentBean departmentBean; public DepartmentBean getDepartmentBean() { return departmentBean; } public void setDepartmentBean(DepartmentBean departmentBean) { this.departmentBean = departmentBean; } //More code } ``` 其中重復的 Bean 如下: `beans.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <beans> <context:annotation-config /> <bean id="employee" class="com.howtodoinjava.autowire.constructor.EmployeeBean" autowire="constructor"> <property name="fullName" value="Lokesh Gupta"/> </bean> <!--First bean of type DepartmentBean--> <bean id="humanResource" class="com.howtodoinjava.autowire.constructor.DepartmentBean" > <property name="name" value="Human Resource" /> </bean> <!--Second bean of type DepartmentBean--> <bean id="finance" class="com.howtodoinjava.autowire.constructor.DepartmentBean" > <property name="name" value="Finance" /> </bean> </beans> ``` ## 4\. 使用`required=false`進行錯誤安全的自動裝配 即使您在自動裝配 Bean 依賴項時已格外小心,仍然可能會發現奇怪的查找失敗。 因此,要解決此問題,您將需要使自動裝配成為可選的,以便在未找到依賴項的情況下,應用程序不應引發任何異常,而自動裝配應被忽略。 這可以通過兩種方式完成: * 如果要使特定 bean **對于特定 bean 屬性非強制裝配**,請在`@Autowired`注解中使用`required="false"`屬性。 `EmployeeBean.java` ```java @Autowired (required=false) @Qualifier ("finance") private DepartmentBean departmentBean; ``` * 如果要在全局級別上應用**可選自動裝配**,即對所有 bean 中的所有屬性進行應用; 使用以下配置。 `beans.xml` ```java <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"> <property name="requiredParameterValue" value="false" /> </bean> ``` ## 5\. 從自動裝配中排除 bean 默認情況下,自動裝配掃描并匹配作用域中的所有 bean 定義。 如果要排除某些 bean 定義,以使它們無法通過自動裝配方式注入,則可以使用設置為`false`的`autowire-candidate`來實現。 1. 如果將`autowire-candidate`用作`false`,則將 bean 排除在自動裝配候選之外。 它將特定的 bean 定義完全排除在自動裝配基礎結構之外。 `beans.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <beans> <context:annotation-config /> <bean id="employee" class="com.howtodoinjava.autowire.constructor.EmployeeBean" autowire="constructor"> <property name="fullName" value="Lokesh Gupta"/> </bean> <!--Will be available for autowiring--> <bean id="humanResource" class="com.howtodoinjava.autowire.constructor.DepartmentBean" > <property name="name" value="Human Resource" /> </bean> <!--Will not participate in autowiring--> <bean id="finance" class="com.howtodoinjava.autowire.constructor.DepartmentBean" autowire-candidate="false"> <property name="name" value="Finance" /> </bean> </beans> ``` 2. 另一個選擇是在 bean 名稱上基于模式匹配限制**自動裝配候選**。 頂層的`<beans />`元素在其`default-autowire-candidates`屬性中接受一個或多個模式。 例如,要將自動裝配候選狀態限制為名稱以`Impl`結尾的任何 bean,請提供值`*Impl`。 要提供多種模式,請在以逗號分隔的列表中定義它們。 `beans.xml` ```java <?xml version="1.0" encoding="UTF-8"?> <beans default-autowire-candidates="*Impl,*Dao"> <context:annotation-config /> <bean id="employee" class="com.howtodoinjava.autowire.constructor.EmployeeBean" autowire="constructor"> <property name="fullName" value="Lokesh Gupta"/> </bean> <!--Will be available for autowiring--> <bean id="humanResource" class="com.howtodoinjava.autowire.constructor.DepartmentBean" > <property name="name" value="Human Resource" /> </bean> <!--Will not participate in autowiring--> <bean id="finance" class="com.howtodoinjava.autowire.constructor.DepartmentBean" autowire-candidate="false"> <property name="name" value="Finance" /> </bean> </beans> ``` 請注意,bean 定義的`autowire-candidate`屬性的顯式值`true`或`false`始終優先,而對于此類 bean,模式匹配規則將不適用。 這就是 **Spring bean 自動裝配**的全部內容。 如有疑問,請發表評論。 學習愉快! [下載源碼](https://github.com/lokeshgupta1981/spring-core/tree/master/src/main/java/com/howtodoinjava/core/autowire)
                  <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>

                              哎呀哎呀视频在线观看