首页 > 其他分享 >Spring IOC官方文档学习笔记(五)之bean的作用域

Spring IOC官方文档学习笔记(五)之bean的作用域

时间:2022-12-27 23:56:02浏览次数:47  
标签:web 作用域 Spring bean 实例 prototype

1.Bean的作用域

(1) Bean的作用域即Bean实例的作用范围,Spring支持6种bean的作用域,其中4种只能在web环境中使用,具体如下

作用域 描述
singleton 默认作用域,采用单例模式,Spring只会创建一个该bean实例,每次请求时Spring返回的都是同一个bean实例
prototype 采用原型模式,Spring会创建多个该bean实例,每次请求时Spring返回的都是一个新的bean实例
request 仅用于web环境,Spring会为每次Http请求创建一个新的bean实例
session 仅用于web环境,Spring会为每个Session创建一个新的bean实例
application 仅用于web环境,Spring会为每个ServletContext创建一个新的bean实例
websocket 仅用于web环境,Spring会为每个websocket创建一个新的bean实例

(2) Singleton作用域:如果一个bean的作用域为singleton,那么Spring只会创建出一个该bean实例存储于IOC容器中,之后每次对这个bean的请求都只会返回容器中的那个特定的bean实例,换句话说,对该bean请求返回的结果都是相同的,如下图

基于xml的配置如下

<beans ...>
    <!-- scope属性用于声明bean的作用域,默认值即为singleton -->
    <bean id="exampleA" class="cn.example.spring.boke.ExampleA" scope="singleton"></bean>
</beans>

(3) Prototype作用域:如果一个bean的作用域为prototype,那么我们每次对这个bean的请求都会导致Spring会为我们创建出一个全新的bean实例并返回,换句话说,对该bean请求返回的结果都是不同(全新)的,如下图

基于xml的配置如下

<beans ...>
    <!-- scope属性用于声明bean的作用域-->
    <bean id="exampleA" class="cn.example.spring.boke.ExampleA" scope="prototype"></bean>
</beans>

注意:最好对无状态的bean采用singleton模式,而对有状态的bean采用prototype模式,此外,与其他作用域的bean相比,Spring不会管理prototype bean的完整生命周期,即Spring只管prototype bean的创建,不管它的销毁,prototype bean的初始化回调会被Spring调用,但它的销毁回调却不会,因此,我们在使用prototype bean时,必须清理其所拥有的资源,防止内存泄漏(清理方式:通过自定义bean后置处理器)

(4) request,session,application与websocket这4种作用域只能在web环境中使用,否则会抛出异常,此外,如果当前的servlet环境是Spring MVC环境且请求均通过DispatcherServlet进行处理,那么无需任何其他配置,直接就可以使用这4种作用域,否则,需要进行一些特殊的配置,具体可参考官方文档,此处略

(5) 当我们想要将一个短作用域(例如:request)的bean注入到一个长作用域(例如:singleton)的bean中时,可选择注入这个短作用域bean的AOP代理对象,这是因为通常容器只初始化一次,因此singleton bean的依赖项也只会被注入一次,从而我们所获得的依赖项至始至终都是相同的,在这种情况下,我们就需要一个代理对象,在每次http request时都让这个代理去获取实际对象并进行方法委托,从而执行正确的方法调用

未完待续...

标签:web,作用域,Spring,bean,实例,prototype
From: https://www.cnblogs.com/shame11/p/17007125.html

相关文章

  • 基于springboot+mybatis+mysql+html实现校园宿舍管理系统
    @目录一、系统简介二、系统主要功能界面三、其它系统四、源码下载一、系统简介本系统功能模块主要分为:信息浏览浏览功能、宿舍打卡浏览功能、学生提交信息功能、宿舍搜索......
  • SpringBoot - 注入原生注解 Servlet,Filter,Listener
    @ServletComponentScan(basePackages=“com.atguigu.admin”)指定原生Servlet组件都放在那里@WebServlet(urlPatterns=“/my”)直接响应,没有经过Spring的拦截器@WebF......
  • SpringBoot vue
    springboot整合vue就行前后端完全分离,监听器,过滤器,拦截器https://github.com/ninuxGithub/spring-boot-vue-separateAblogbuiltupwithSpringBootinthebackend......
  • Spring-Security-OAuth2调用微信API
     importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation......
  • 使用Spring Session实现Spring Boot水平扩展
    小编说:本文使用SpringSession实现了SpringBoot水平扩展,每个SpringBoot应用与其他水平扩展的SpringBoot一样,都能处理用户请求。如果宕机,Nginx会将请求反向代理到其他运行......
  • spring security oauth2
     ​​https://connect.qq.com/manage.html#/​​​​http://wiki.connect.qq.com/%E7%BD%91%E7%AB%99%E5%BA%94%E7%94%A8%E6%8E%A5%E5%85%A5%E6%B5%81%E7%A8%8B​​​​ h......
  • Supported method argument types Spring MVC
    @GetMapping("/something")@ResponseBodypublicStringhelloWorld(){return"HelloWorld";} @Controller@RequestMapping("/pets")@SessionAttributes("pet")public......
  • Securing Spring Cloud Microservices With OAuth2
    FromZerotoOAuth2inSpringcloudTodayIampresentinghoursofresearchabouta(apparently)simplequestion:“HowcanImaintainsecurityinmymicroservic......
  • Spring Security 实战:QQ登录实现
     准备工作1、在 ​​​QQ互联​​​ 申请成为开发者,并创建应用,得到APPID和APPKey。2、了解QQ登录时的 ​​​网站应用接入流程​​​。(必须看完看懂)为了方便各位测......
  • SpringBoot - 实现AOP与声明式事务
    1.实现声明式事务低版本在启动类(@SpringBootApplication)上加上@EnableTransactionManagement注解@EnableTransactionManagement注解其实在大多数情况下,不是必须的,因为S......