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。
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中的作用域代理相关推荐
- Spring Framework 中文官方文档
Spring Framework 中文官方文档 目前为最新版 5.3.11. 其他spring文档不断更新中 1.历史.设计理念.反馈.入门. Overview 2.IoC 容器.事件.资源.i18n ...
- Spring Framework 中文文档
点击下方蓝色字体链接即可跳转 Spring Framework 中文文档
- 在Spring Framework中@Inject和@Autowired有什么区别? 在什么条件下使用哪一个?
本文翻译自:What is the difference between @Inject and @Autowired in Spring Framework? Which one to use un ...
- spring配置jndi_在Spring Framework中通过JNDI进行配置
spring配置jndi 从某个时候开始,应用程序必须是可配置的. 从第一个版本0.9开始,Spring Framework就为该问题提供了一个很好的辅助工具,该类为PropertyPlacehold ...
- 在Spring Framework中通过JNDI进行配置
从某个时候开始,应用程序必须是可配置的. 自第一个版本0.9起,Spring Framework就为该问题提供了一个很好的辅助工具,该类为PropertyPlaceholderConfigurer类, ...
- Spring AOP中的静态代理和动态代理的原理和实践
对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利.无论你是对的还是错的,都会在这个平台上找到答案.所以,我会尽可能去写 ...
- Spring IOC中 Bean 作用域
Spring Bean 作用域 Spring 3 中为Bean定义了5种作用域,它们是:singleton(单例).prototype(原型).request.session 和 global se ...
- Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:
① JDK动态代理只提供接口的代理,不支持类的代理,要求被代理类实现接口.JDK动态代理的核心是InvocationHandler接口和Proxy类,在获取代理对象时,使用Proxy类来动态创建目标类 ...
- Spring Framework框架起步,小白都看得懂(官翻版)!
写在开头 本篇章介绍Spring框架的完整的全部技术.写这篇文章的目的是,一方面为了给初入后端开发的才子一篇入门指导,另一方面是为了自己对于基础知识的查阅. Spring不一定是最好的框架(虽然综合能 ...
最新文章
- 常见浏览器User-Agent大全
- 解决苹果APP审核需要的IPv6地址的问题
- ARMV8 datasheet学习笔记3:AArch64应用级体系结构
- Python并发与并行的新手指南
- (3.1)HarmonyOS鸿蒙单击事件4种写法
- 【转】iOS的APP资源,开源的哦
- 电脑重启后不必输入用户名密码,直接自己登入的方法
- 2012年最新75款免费的专业英文字体下载【下篇】
- zk和redis分布式锁比较
- 由一次NoHttpResponseException异常,追究到Http长连接和短连接
- 稳压二极管的工作原理及稳压二极管使用电路图
- Python工程目录结构
- SW小技巧2:将属性链接到 SOLIDWORKS 工程图的简便方法
- TortoiseSvn执行SVN Commit一直显示Please wait...问题解决
- 二手房各项税费计算公式
- webpack的source-map的详解
- NLP是什么,百度的NLP技术有有哪些?
- 量子计算机意识永生,量子计算机如何使未来的人类永生
- linux正则表达式与文本处理工具
- linux驱动之一、LED驱动(驱动代码小结附:github代码链接)
热门文章
- POJ1330-Nearest Common Ancestors【tarjan,LCA】
- 2021牛客暑期多校训练营5 E-Eert Esiwtib(树形dp+位运算)
- 2019.01.28【NOIP普及组】模拟赛C组总结
- 5、mysql中的库操作
- 浅谈MySQL的B树索引与索引优化
- Tomcat启动超时问题Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
- spring boot使用注解的方式整合mybaits
- java中你知道的这四种代码块吗?
- 《走遍中国》珍藏版(二)
- JSP 登录案例实现