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。

public class SingletonScopedBean{
private PrototypeScopedBean prototypeScopedBean;  public String getState(){return this.prototypeScopedBean.getState();}
}
Public class PrototypeScopedBean{private final String state;
public String getState() {return state;}
public void setState() {this.state = UUID.randomUUID().toString();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd">
<bean id=”prototypeScopedBean” class=”org.example. PrototypeScopedBean” scope=”prototype” >
<aop:scoped-proxy/>
</bean>
<bean id=”singletonScopedBean” class=”org.example. SingletonScopedBean”>
<property name=”prototypeScopedBean” ref=”prototypeScopedBean”>
</bean>
</beans>

这将为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中的作用域代理相关推荐

  1. Spring Framework 中文官方文档

    Spring Framework 中文官方文档 目前为最新版 5.3.11. 其他spring文档不断更新中 1.历史.设计理念.反馈.入门. Overview 2.IoC 容器.事件.资源.i18n ...

  2. Spring Framework 中文文档

    点击下方蓝色字体链接即可跳转 Spring Framework 中文文档

  3. 在Spring Framework中@Inject和@Autowired有什么区别? 在什么条件下使用哪一个?

    本文翻译自:What is the difference between @Inject and @Autowired in Spring Framework? Which one to use un ...

  4. spring配置jndi_在Spring Framework中通过JNDI进行配置

    spring配置jndi 从某个时候开始,应用程序必须是可配置的. 从第一个版本0.9开始,Spring Framework就为该问题提供了一个很好的辅助工具,该类为PropertyPlacehold ...

  5. 在Spring Framework中通过JNDI进行配置

    从某个时候开始,应用程序必须是可配置的. 自第一个版本0.9起,Spring Framework就为该问题提供了一个很好的辅助工具,该类为PropertyPlaceholderConfigurer类, ...

  6. Spring AOP中的静态代理和动态代理的原理和实践

    对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利.无论你是对的还是错的,都会在这个平台上找到答案.所以,我会尽可能去写 ...

  7. ​Spring IOC中 Bean 作用域

    ​Spring Bean 作用域 Spring 3 中为Bean定义了5种作用域,它们是:singleton(单例).prototype(原型).request.session 和 global se ...

  8. Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:

    ① JDK动态代理只提供接口的代理,不支持类的代理,要求被代理类实现接口.JDK动态代理的核心是InvocationHandler接口和Proxy类,在获取代理对象时,使用Proxy类来动态创建目标类 ...

  9. Spring Framework框架起步,小白都看得懂(官翻版)!

    写在开头 本篇章介绍Spring框架的完整的全部技术.写这篇文章的目的是,一方面为了给初入后端开发的才子一篇入门指导,另一方面是为了自己对于基础知识的查阅. Spring不一定是最好的框架(虽然综合能 ...

最新文章

  1. 常见浏览器User-Agent大全
  2. 解决苹果APP审核需要的IPv6地址的问题
  3. ARMV8 datasheet学习笔记3:AArch64应用级体系结构
  4. Python并发与并行的新手指南
  5. (3.1)HarmonyOS鸿蒙单击事件4种写法
  6. 【转】iOS的APP资源,开源的哦
  7. 电脑重启后不必输入用户名密码,直接自己登入的方法
  8. 2012年最新75款免费的专业英文字体下载【下篇】
  9. zk和redis分布式锁比较
  10. 由一次NoHttpResponseException异常,追究到Http长连接和短连接
  11. 稳压二极管的工作原理及稳压二极管使用电路图
  12. Python工程目录结构
  13. SW小技巧2:将属性链接到 SOLIDWORKS 工程图的简便方法
  14. TortoiseSvn执行SVN Commit一直显示Please wait...问题解决
  15. 二手房各项税费计算公式
  16. webpack的source-map的详解
  17. NLP是什么,百度的NLP技术有有哪些?
  18. 量子计算机意识永生,量子计算机如何使未来的人类永生
  19. linux正则表达式与文本处理工具
  20. linux驱动之一、LED驱动(驱动代码小结附:github代码链接)

热门文章

  1. POJ1330-Nearest Common Ancestors【tarjan,LCA】
  2. 2021牛客暑期多校训练营5 E-Eert Esiwtib(树形dp+位运算)
  3. 2019.01.28【NOIP普及组】模拟赛C组总结
  4. 5、mysql中的库操作
  5. 浅谈MySQL的B树索引与索引优化
  6. Tomcat启动超时问题Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
  7. spring boot使用注解的方式整合mybaits
  8. java中你知道的这四种代码块吗?
  9. 《走遍中国》珍藏版(二)
  10. JSP 登录案例实现