博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring框架系列(三)--Bean的作用域和生命周期
阅读量:5264 次
发布时间:2019-06-14

本文共 2270 字,大约阅读时间需要 7 分钟。

Bean的作用域

Spring应用中,对象实例都是在Container中,负责创建、装配、配置和管理生命周期(new到finalize())

Spring Container分为两种:

  1、BeanFactory:提供DI支持

  2、ApplicationContext:基于BeanFactory构建,提供应用框架级别的服务

使用应用上下文:

  1、AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文

  2、AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文

  3、ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源

  4、FileSystemXmlapplicationcontext从文件系统下的一个或多XML配置文件中加载上下文定义

  5、XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义

加载上下文的方式都很相似:都是直接new ApplicationContext applicationContext = new ClassPathXmlApplicationContext

("applicationContext.xml"); 之后就是调用应用上下文的getBean()获取bean

作用域范围:

  1、单例Singleton:在整个应用中,只创建bean的一个实例,在IOC容器中共享,容器创建的时候就实例化了这个bean

  2、原型Prototype:每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例,相当于每次都new bean(),容器创建的

时候没有实例化了bean,而是请求获取的时候才会创建对象

  3、会话Session:只是在Web应用中,为每个http session创建一个bean实例

  4、请求Rquest:只是在Web应用中,为每个http请求创建一个bean实例,这个bean实例只在当前request请求内有效,请求结束的时候,这个

bean实例被销毁

  5、全局会话GlobalSession:只是在Web应用中使用,仅在使用portlet context的时候有效

1、Singleton:

默认为Singleton,对于无状态的bean可以使用单例,如果使用非单例,通过@Scope设置

无状态Bean:

  无状态是指没有成员变量,例如service、dao,虽然service里面有dao,但是dao是没有状态的

  有状态是指有成员变量,例如controller内部一般有类似UserDTO的有状态bean,所以一般使用prototype

容器实例化的时候就会初始化bean,可以通过lazy-init="true"/@Lazy设置延迟加载,当第一次获取bean的时候进行初始化

@Lazy(true) @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public class Student {  }

2、Prototype:

scope使用Prototype,默认懒加载,即等到获取bean的时候进行初始化,而不是容器实例化的时候

当容器关闭的时候,destroy()不会被执行

Bean的生命周期

流程:

  1、Spring对bean进行实例化

  2、Spring将值和bean的引用注入到bean对应的属性中

  3、如果bean实现了BeanNameAware接口, Spring将bean的ID传递给setBeanName()

  4、如果bean实现了BeanFactoryAware接口, Spring将调用setBeanFactory(),将BeanFactory容器实例传入

  5、如果bean实现了ApplicationContextAware接口, Spring将调用setApplicationContext(),将bean所在的应用上下文的引用传入

进来

  6、如果bean实现了BeanPostProcessor接口, Spring将调用它们的postProcessBeforeInitialization()

  7、如果bean实现了InitializingBean接口, Spring将调用它们的afterPropertiesSet()。类似地,如果bean使用init-method声

明了初始化方法,该方法也会被调用

  8、如果bean实现了BeanPostProcessor接口, Spring将调用它们的postProcessAfterInitialization()

  9、此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁

  10、如果bean实现了DisposableBean接口, Spring将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了

毁方法,该方法也会被调用

转载于:https://www.cnblogs.com/huigelaile/p/10975128.html

你可能感兴趣的文章
Dijkstra+计算几何 POJ 2502 Subway
查看>>
修复IE不能执行JS的方法
查看>>
程序员究竟该如何提高效率zt
查看>>
希尔排序法(缩小增量法)
查看>>
PHP编程基础学习(一)——数据类型
查看>>
MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询
查看>>
NPOI处理Word文本中上下角标
查看>>
Android笔记 Handler
查看>>
如何阅读大型前端开源项目的源码(转)
查看>>
java.util.Arrays类详解
查看>>
idea搭建tocmat
查看>>
NYOJ-626-intersection set(二分查找)
查看>>
项目管理之路(1):初步踏入项目管理
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
echarts饼图显示百分比
查看>>
JMS消息
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
php上传文件及头像预览
查看>>
大四java实习生的一些经历
查看>>
线程池的概念
查看>>