javascript
Spring Framework中的作用域代理
Spring框架提供了Spring bean的作用域。
我們可以使用spring范圍控制插入Spring bean的各種依賴關(guān)系和配置值。
Spring支持以下六個(gè)范圍。 在基于Web的應(yīng)用程序中可以使用六個(gè)中的四個(gè):
| 范圍 | 描述 |
| 辛格爾頓 | 它是Spring框架中的默認(rèn)范圍。 對(duì)于每個(gè)Spring IOC容器,將僅創(chuàng)建Bean的單個(gè)實(shí)例。 |
| 原型 | 每當(dāng)從上下文請(qǐng)求bean時(shí),每次都會(huì)創(chuàng)建一個(gè)新實(shí)例。 |
| 請(qǐng)求 | Bean范圍到HttpServlet Request。 對(duì)于每個(gè)新請(qǐng)求,將創(chuàng)建一個(gè)新的bean實(shí)例。該實(shí)例僅適用于基于Web的應(yīng)用程序。 |
| 屆會(huì) | 將bean定義的作用域限定為Http會(huì)話,對(duì)于每個(gè)新會(huì)話,將返回該bean的新實(shí)例,僅在可識(shí)別Web的Spring應(yīng)用程序上下文中有效。 |
| 應(yīng)用 | 將Bean定義的作用域限定為ServletContext。 僅在可感知網(wǎng)絡(luò)的Spring應(yīng)用程序上下文中有效。 |
| 網(wǎng)絡(luò)插座 | 將bean定義的范圍限定在WebSocket會(huì)話的生命周期內(nèi)。 僅在可感知網(wǎng)絡(luò)的Spring應(yīng)用程序上下文中有效。 |
Spring Framework提供了用于創(chuàng)建新范圍的接口。
1.將Bean視為依賴項(xiàng)
假設(shè)beanA具有單例作用域,而beanB具有原型作用域。 假設(shè)beanA具有beanB依賴性。 然后,無需使用任何其他配置,它就提供了隨機(jī)行為,因?yàn)閎eanA將具有該容器的單個(gè)實(shí)例,但是beanB將不會(huì)具有相同的行為。 每當(dāng)從容器請(qǐng)求beanB時(shí),都會(huì)創(chuàng)建一個(gè)新實(shí)例。
為了解決這些類型的問題, Java spring框架提供了稱為代理bean的概念。
對(duì)于范圍小于父級(jí)的依賴項(xiàng),框架將創(chuàng)建代理而不是創(chuàng)建實(shí)際對(duì)象。 這些代理將擴(kuò)展原始對(duì)象。
每當(dāng)beanB中的方法被調(diào)用時(shí),內(nèi)部都會(huì)在代理對(duì)象上調(diào)用它,而不是在實(shí)際對(duì)象上調(diào)用它。 代理將嘗試根據(jù)作用域從上下文獲取對(duì)象,并將對(duì)其調(diào)用原始方法。
例如,SingletonScopedBean,PrototypeScopedBean是分別具有默認(rèn)作用域和原型作用域的兩個(gè)bean。
這將為prototypeScopedBean創(chuàng)建代理bean,并將代理作為依賴項(xiàng)附加到singletonScopedBean。
每當(dāng)在prototypeScopedBean bean上調(diào)用getState()方法時(shí),它將在proxy上調(diào)用該方法,并且proxy將解析prototypeScopedBean實(shí)例,并在已解析的對(duì)象上調(diào)用getState()方法。
2.可以通過兩種方式創(chuàng)建代理
- 基于JDK的代理
- 基于CGLIB(動(dòng)態(tài)代理)的代理。
為了創(chuàng)建基于JDK的代理,必須在一個(gè)接口上實(shí)現(xiàn)該類。
對(duì)于基于CGLIB的代理,不存在此限制。
我們可以使用proxy-target-class屬性指定代理類型。 如果值為true,則將創(chuàng)建CGLIB代理。 如果該值為false,它將嘗試創(chuàng)建基于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的作用域代理-結(jié)論
我們學(xué)習(xí)了Spring bean作用域,以及如何在bean依賴項(xiàng)中注入各種作用域。 我們還學(xué)習(xí)了不同類型的代理模式。
翻譯自: https://www.javacodegeeks.com/scoped-proxy-in-spring-framework.html
總結(jié)
以上是生活随笔為你收集整理的Spring Framework中的作用域代理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java项目:书评
- 下一篇: 联想的意思(组合联想的意思)