javascript
Spring Framework中的作用域代理
Spring框架提供了Spring bean的作用域。
我們可以使用spring范圍控制插入Spring bean的各種依賴關系和配置值。
Spring支持以下六個范圍。 在基于Web的應用程序中可以使用六個中的四個:
| 范圍 | 描述 |
| 辛格爾頓 | 它是Spring框架中的默認范圍。 對于每個Spring IOC容器,將僅創建Bean的單個實例。 |
| 原型 | 每當從上下文請求bean時,每次都會創建一個新實例。 |
| 請求 | Bean范圍到HttpServlet Request。 對于每個新請求,將創建一個新的bean實例。該實例僅適用于基于Web的應用程序。 |
| 屆會 | 將bean定義的作用域限定為Http會話,對于每個新會話,將返回該bean的新實例,僅在可識別Web的Spring應用程序上下文中有效。 |
| 應用 | 將Bean定義的作用域限定為ServletContext。 僅在可感知網絡的Spring應用程序上下文中有效。 |
| 網絡插座 | 將bean定義的范圍限定在WebSocket會話的生命周期內。 僅在可感知網絡的Spring應用程序上下文中有效。 |
Spring Framework提供了用于創建新范圍的接口。
1.將Bean視為依賴項
假設beanA具有單例作用域,而beanB具有原型作用域。 假設beanA具有beanB依賴性。 然后,無需使用任何其他配置,它就提供了隨機行為,因為beanA將具有該容器的單個實例,但是beanB將不會具有相同的行為。 每當從容器請求beanB時,都會創建一個新實例。
為了解決這些類型的問題, Java spring框架提供了稱為代理bean的概念。
對于范圍小于父級的依賴項,框架將創建代理而不是創建實際對象。 這些代理將擴展原始對象。
每當beanB中的方法被調用時,內部都會在代理對象上調用它,而不是在實際對象上調用它。 代理將嘗試根據作用域從上下文獲取對象,并將對其調用原始方法。
例如,SingletonScopedBean,PrototypeScopedBean是分別具有默認作用域和原型作用域的兩個bean。
這將為prototypeScopedBean創建代理bean,并將代理作為依賴項附加到singletonScopedBean。
每當在prototypeScopedBean bean上調用getState()方法時,它將在proxy上調用該方法,并且proxy將解析prototypeScopedBean實例,并在已解析的對象上調用getState()方法。
2.可以通過兩種方式創建代理
- 基于JDK的代理
- 基于CGLIB(動態代理)的代理。
為了創建基于JDK的代理,必須在一個接口上實現該類。
對于基于CGLIB的代理,不存在此限制。
我們可以使用proxy-target-class屬性指定代理類型。 如果值為true,則將創建CGLIB代理。 如果該值為false,它將嘗試創建基于JDK的代理。
注釋方法: Spring框架提供@Scope注釋以指定范圍。 proxyMode是用于指定代理類型的注釋屬性。
@Component @Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS) public class PrototypeScopedBean{private final String state; public String getState() {return state;} public void setState() {this.state = UUID.randomUUID().toString(); } } @Component public class SingletonScopedBean{@Autowired private PrototypeScopedBean prototypeScopedBean;public String getState(){return this.prototypeScopedBean.getState();} }通過上述更改,SingletonScopedBean將具有PrototypeScopedBean bean類型作為代理。
3. Spring的作用域代理-結論
我們學習了Spring bean作用域,以及如何在bean依賴項中注入各種作用域。 我們還學習了不同類型的代理模式。
翻譯自: https://www.javacodegeeks.com/scoped-proxy-in-spring-framework.html
總結
以上是生活随笔為你收集整理的Spring Framework中的作用域代理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java项目:书评
- 下一篇: Spring Bean范围