<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國際加速解決方案。 廣告
                # Spring 5 – Bean 范圍 > 原文: [https://howtodoinjava.com/spring-core/spring-bean-scopes/](https://howtodoinjava.com/spring-core/spring-bean-scopes/) 在 Spring 框架中,我們可以在 6 個內置的 **spring bean 范圍**中創建 bean,還可以定義**自定義 bean 作用域**。 在這六個范圍中,只有當您使用網絡感知`ApplicationContext`時,四個才可用。 `singleton`和`prototype`范圍在任何類型的 IOC 容器中都可用。 ## 1\. Spring Bean 范圍類型 在 Spring 中,可以使用 spring bean `@Scope`注解定義范圍。 讓我們快速列出所有六個可在 Spring 應用程序上下文中使用的內置 bean 范圍。 這些相同的范圍也適用于 SpringBoot bean 范圍。 | 范圍 | 描述 | | --- | --- | | `singleton`(默認) | 每個 spring IoC 容器一個 bean 對象實例 | | `prototype` | 與單例相反,每次請求 bean 時,它都會產生一個新實例。 | | `request` | 將創建一個單例,并在 HTTP 請求的整個生命周期中可用。僅在可感知網絡的 Spring `ApplicationContext`中有效。 | | `session` | 一個單例將在 HTTP 會話的整個生命周期中創建并可用。僅在可感知網絡的 Spring `ApplicationContext`中有效。 | | `application` | 一個單例將在`ServletContext`的整個生命周期中創建并可用。僅在可感知網絡的 Spring `ApplicationContext`中有效。 | | `websocket` | 一個單例將在`WebSocket`的整個生命周期中創建并可用。僅在可感知網絡的 Spring `ApplicationContext`中有效。 | #### 1.1. 單例范圍 `singleton`是 spring 容器中的默認 bean 作用域。 它告訴容器每個容器僅創建和管理一個 bean 類實例。 該單個實例存儲在此類[單例](https://howtodoinjava.com/design-patterns/creational/singleton-design-pattern-in-java/) Bean 的緩存中,并且對該命名 Bean 的所有后續請求和引用都返回該緩存的實例。 使用 Java 配置的單例作用域 bean 的示例: ```java @Component //This statement is redundant - singleton is default scope @Scope("singleton") //This statement is redundant public class BeanClass { } ``` 使用 XML 配置的單例作用域 bean 的示例: ```java <!-- To specify singleton scope is redundant --> <bean id="beanId" class="com.howtodoinjava.BeanClass" scope="singleton" /> //or <bean id="beanId" class="com.howtodoinjava.BeanClass" /> ``` #### 1.2. 原型范圍 每當應用程序代碼對 Bean 進行請求時,`prototype`范圍都會導致創建新的 Bean 實例。 您應該知道,銷毀[ bean 生命周期方法](https://howtodoinjava.com/spring/spring-core/spring-bean-life-cycle/)沒有被稱為`prototype`作用域 bean,僅調用了初始化回調方法。 因此,作為開發人員,您需要負責清理原型作用域的 Bean 實例以及其中包含的所有資源。 原型 bean 范圍的 Java 配置示例: ```java @Component @Scope("prototype") public class BeanClass { } ``` 原型 bean 范圍的 XML 配置示例: ```java <bean id="beanId" class="com.howtodoinjava.BeanClass" scope="prototype" /> ``` 通常,您應該對所有有狀態 Bean 使用`prototype`范圍,而對無狀態Bean使用`singleton`范圍。要在請求,會話,應用程序和 Websocket 范圍中使用 Bean,您需要注冊[`RequestContextListener`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/context/request/RequestContextListener.html)或者[`RequestContextFilter`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/filter/RequestContextFilter.html)。 #### 1.3. 請求范圍 在`request`范圍內,容器為每個 HTTP 請求創建一個新實例。 因此,如果服務器當前正在處理 50 個請求,則容器最多可以具有 50 個單獨的 Bean 類實例。 對一個實例的任何狀態更改,對其他實例都不可見。 請求完成后,這些實例將被銷毀。 請求 bean 范圍的 Java 配置示例: ```java @Component @Scope("request") public class BeanClass { } //or @Component @RequestScope public class BeanClass { } ``` 請求 bean 范圍的 XML 配置示例: ```java <bean id="beanId" class="com.howtodoinjava.BeanClass" scope="request" /> ``` > 閱讀更多: [Web 服務器如何工作?](https://howtodoinjava.com/server/tomcat/a-birds-eye-view-on-how-web-servers-work/) #### 1.4. 會話范圍 在`session`范圍內,容器為每個 HTTP 會話創建一個新實例。 因此,如果服務器有 20 個活動會話,則容器最多可以具有 20 個 Bean 類的單獨實例。 單個會話生存期內的所有 HTTP 請求都可以訪問該會話范圍內的同一單個 Bean 實例。 對一個實例的任何狀態更改,對其他實例都不可見。 一旦會話在服務器上銷毀/結束,這些實例將被銷毀。 會話 bean 范圍的 Java 配置示例: ```java @Component @Scope("session") public class BeanClass { } //or @Component @SessionScope public class BeanClass { } ``` 會話 bean 范圍的 XML 配置示例: ```java <bean id="beanId" class="com.howtodoinjava.BeanClass" scope="session" /> ``` #### 1.5. 應用范圍 在`application`范圍內,容器為每個 Web 應用程序運行時創建一個實例。 它幾乎與`singleton`示波器相似,只有兩個區別,即 1. `application`范圍的 bean 是每個`ServletContext`單身,而`singleton`范圍的 bean 是每個`ApplicationContext`單身。 請注意,單個應用程序可以有多個應用程序上下文。 2. `application`范圍內的 bean 作為`ServletContext`屬性可見。 應用程序 bean 范圍的 Java 配置示例: ```java @Component @Scope("application") public class BeanClass { } //or @Component @ApplicationScope public class BeanClass { } ``` 應用程序 bean 范圍的 XML 配置示例: ```java <bean id="beanId" class="com.howtodoinjava.BeanClass" scope="application" /> ``` #### 1.6. websocket 范圍 [WebSocket 協議](https://tools.ietf.org/html/rfc6455)允許客戶端與已選擇與客戶端通信的遠程主機之間進行雙向通信。 WebSocket 協議為雙向通信提供單個 TCP 連接。 這對于同時編輯和多用戶游戲的多用戶應用程序特別有用。 在這種類型的 Web 應用程序中,HTTP 僅用于初始握手。 如果服務器同意,服務器可以以[ HTTP 狀態 101(交換協議)](https://restfulapi.net/http-status-codes/)進行響應。 如果握手成功,則 TCP 套接字保持打開狀態,客戶端和服務器都可以使用該套接字向彼此發送消息。 websocket bean 作用域的 Java 配置示例: ```java @Component @Scope("websocket") public class BeanClass { } ``` Websocket bean 作用域的 XML 配置示例: ```java <bean id="beanId" class="com.howtodoinjava.BeanClass" scope="websocket" /> ``` 請注意,`websocket`范圍內的 bean 通常是單例的,并且比任何單獨的 WebSocket 會話的生存期都更長。 ## 2\. 自定義線程范圍 Spring 還使用類`SimpleThreadScope`提供了非默認`thread`范圍。 要使用此作用域,必須使用`CustomScopeConfigurer`類將其注冊到容器。 ```java <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> <property name="scopes"> <map> <entry key="thread"> <bean class="org.springframework.context.support.SimpleThreadScope"/> </entry> </map> </property> </bean> ``` 對 bean 的每個請求都將在同一線程中返回相同的實例。 線程 bean 范圍的 Java 配置示例: ```java @Component @Scope("thread") public class BeanClass { } ``` 線程 bean 范圍的 XML 配置示例: ```java <bean id="beanId" class="com.howtodoinjava.BeanClass" scope="thread" /> ``` ## 3\. 總結 Spring 框架提供了六個 Spring bean 作用域,并且實例在每個作用域內具有不同的生命周期跨度。 作為開發人員,我們必須明智地選擇任何容器管理的 bean 的范圍。 同樣,當具有不同作用域的 bean 相互引用時,我們必須做出明智的決定。 試著記住上面給出的所有信息,以回答任何 SpringBean 范圍面試問題。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看