知识大全 Spring Singleton的陷阱介绍

Posted 信息

篇首语:后悔过去,不如奋斗将来。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Spring Singleton的陷阱介绍相关的知识,希望对你有一定的参考价值。

Spring Singleton的陷阱介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  这是一个真实的案例 我们在项目中使用Spring和ACEGI 我之所以选择ACEGI 除了它对权限的良好控制外

  我还看好它的SecurityContextHolder 通过代码 Authentication auth = SecurityContextHolder getContext() getAuthentication()

  我可以很容易在系统任意一层得到用户的信息 而不用把用户信息在参数里传来传去 (这也是struts的缺点之一)

  但是我在每一次要得到用户信息的时候都写上面的一段代码 未免有些麻烦 所以我在BaseService BaseDao里都提供了如下方法 /**//**

  * get current login user info

  * @return UserInfo

  */

  protected UserInfo getUserInfo()

  ……

  return getUserContext() getUserInfo()

  

  /**//**

  * get current login user context

  * @return UserContext

  */

  protected UserContext getUserContext()

  ……

  Authentication auth = SecurityContextHolder getContext() getAuthentication()

  return (UserContext) auth getPrincipal()

  

  这样在其他的Service和Dao类里可以通过 super getUserContext() super getUserInfo()

  来得到用户的信息 这也为问题的产生提供了温床 请看如下代码 public class SomeServece extends BaseService implements SomeInterFace

  ……

  private UserInfo user = super getUserInfo()

  public someMethod()

  ……

  int userID = this user getUserID()

  String userName = this user getUserName()

  //bla bla do something user userID and userNaem

  

  

  这段代码在单元测试的时候不会用任何问题 但是在多用户测试的情况下 你会发现任何调用SomeService里someMethod()方法的userID和userName都是同一个人 也就是第一个登陆的人的信息 Why?

  其根本原因是Spring的Bean在默认情况下是Singleton的 Bean SomeServece的实例只会生成一份 也就是所SomeServece实例的user 对象只会被初始化一次 就是第一次登陆人的信息 以后不会变了 所以BaseService想为开发提供方便 确给开发带来了风险正确的用法应该是这样的 public class SomeServece extends BaseService implements SomeInterFace

  ……

  public someMethod()

  ……

  int userID = super getUserInfo() getUserID()

  String userName = super getUserInfo() getUserName()

  //bla bla do something user userID and userNaem

  

cha138/Article/program/Java/ky/201311/28799

相关参考

知识大全 Spring MVC学习之注解介绍

SpringMVC学习之注解介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  spring的注

知识大全 单件模式singleton的理解

  Singleton模式是一个较为简单的模式下面的代码就可以建立一个Singlton模式的例子这是一个写系统日志的类实际应用的意义在于在内存中只保存一个实例避免开辟多个功能相同的工具类实例而耗用系统

知识大全 spring 核心包介绍

  springjar是包含有完整发布的单个jar包springjar中包含除了springmockjar里所包含的内容外其它所有jar包的内容因为只有在开发环境下才会用到springmockjar来

知识大全 .Net 单例模式(Singleton)

.Net单例模式(Singleton)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!单例模式的意思

知识大全 Spring MVC 框架方法入参的介绍

SpringMVC框架方法入参的介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Spring

知识大全 Singleton设计模式的C#实现

Singleton设计模式的C#实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Singleto

知识大全 设计模式之Singleton(单态模式)

设计模式之Singleton(单态模式)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘要讨论

知识大全 C# “Singleton” 模式四种实现方法

C#“Singleton”模式四种实现方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  大家一

知识大全 在Java中应用设计模式Singleton

在Java中应用设计模式Singleton  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &nb

知识大全 在Java中应用设计模式之Singleton

在Java中应用设计模式之Singleton  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  基本