作用域

  • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
  • prototype : 每次请求都会创建一个新的 bean 实例。
  • request : 每一次HTTP请求都会产生一个新的bean,该bean仅在当前HTTP request内有效。
  • session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。
  • global-session: 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。Portlet是能够生成语义代码(例如:HTML)片段的小型Java Web插件。它们基于portlet容器,可以像servlet一样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有不同的会话

题外话:Spring 中的单例 bean 的线程安全问题了解吗?

  • 大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例 bean 存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。
  • 解决方案:
    1 在Bean对象中尽量避免定义可变的成员变量(不太现实)。
    2 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)。

生命周期

  • Bean容器找到配置文件中 Spring Bean 的定义。
  • Bean容器利用 Java Reflection API 创建一个Bean的实例。
  • 如果涉及到一些属性值 利用 set()方法设置一些属性值。
  • 如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入Bean的名字。
  • 如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoader对象的实例。
  • 与上面的类似,如果实现了其他 *.Aware接口,就调用相应的方法。
  • 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法
  • 如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。
  • 如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。
  • 如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法
  • 当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。
  • 当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。


最新文章

  1. 使select文本框可编辑可选择(jQuery插件)
  2. 篇二:JS身份证校验
  3. Java泛型 E、T、K、V、N
  4. 音频文件解析(一):WAV格式文件头部解析
  5. HTTP 错误 500.22 - Internal Server Error
  6. POJ 2236 Wireless Network(并查集)
  7. gcc学习笔记
  8. C#实现大数字的运算
  9. STL六大组件之——分配器(内存分配,好深奥的东西)
  10. PhotoshopCS4轻松将PSD分层导出为Png分层
  11. Java API —— File类
  12. 【DFS+记忆搜索】NYOJ-10-Skiing
  13. DDL操作前后都有COMMIT
  14. POJ1860 Currency Exchange(最短路)
  15. POJ1363:Rails
  16. 设计一种前端数据延迟加载的jQuery插件(2)
  17. Django+Bootstrap+Mysql 搭建个人博客(五)
  18. Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署
  19. git 错误解决
  20. SecureCRT操作指令

热门文章

  1. Page "页面路径" has not been registered yet.
  2. elasticsearchBouncing Results问题
  3. linux 在指定文件夹下查找指定字符
  4. CSS——文本超出隐藏显示省略号
  5. Python 简明教程 --- 16,Python 高阶函数
  6. C#数据结构与算法系列(二十):插入排序算法(InsertSort)
  7. 使用docker创建rocketMQ容器
  8. Linux hostname主机名配置文件/etc/hosts详解
  9. 112买卖股票的最佳时机II
  10. 【Oracle】arraysize的研究(存在疑问)