论坛首页 Java企业应用论坛

spring中的Singleton与静态类的区别

浏览 20708 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-07-22  
在配置文件中声明bean的类型为Singleton,之后在应用中注入这个bean,使用其中的方法和建一个静态类,之后在应用中直接使用静态类中的方法,这两种方式有什么区别吗?是否是线程安全的呢?
小弟是新手,真心求教,谢谢
   发表时间:2010-07-22  
Spring默认的bean就是Singleton,也就是无状态的bean,说白了全程只有这一个实例,那当然不是线程安全了。
0 请登录后投票
   发表时间:2010-07-22  
刚刚看spring,好像是说.
区别singleton的作用范围在ioc容器.
0 请登录后投票
   发表时间:2010-07-22  
用静态类没有你想象的方便,哪天你做测试时发现这个类依赖一堆静态类没法Mock掉就会骂娘了。
0 请登录后投票
   发表时间:2010-07-22  
singleton是单态模式的 ,有ioc容器管理 ,当然不是线程安全的啦 ,不过所谓的线程安全也是相对的

如果你的类是没有状态的, 那用singleton 的性能要高一些 ,因为只有一个实例 。
如果你的类是有状态的 ,那就必须显示的设置为prototype了

在ssh2 项目中 , struts2的action交由spring管理的时候 ,spring默认是singleton的 ,而struts2的action显然是有状态的 ,所以必须显示设置为
scope=“prototype”

prototype为原型模式 , 每次action请求过来都会创建一个action

但是对那些Dao的实现类推介scope=“singleton” ,因为这些类没有状态,用singleton只需维护一个实例,显然性能高一些
3 请登录后投票
   发表时间:2010-07-22  
线程安全并不是取决于是不是单例
0 请登录后投票
   发表时间:2010-07-22  
呵呵 ,首先spring中的singleton和23中设计模式中的singletong是不同的。确切的说spring中的应该叫单对象。不是严格意义上的单例模式。
1 请登录后投票
   发表时间:2010-07-22  
笑我痴狂 写道
singleton是单态模式的 ,有ioc容器管理 ,当然不是线程安全的啦 ,不过所谓的线程安全也是相对的

如果你的类是没有状态的, 那用singleton 的性能要高一些 ,因为只有一个实例 。
如果你的类是有状态的 ,那就必须显示的设置为prototype了

在ssh2 项目中 , struts2的action交由spring管理的时候 ,spring默认是singleton的 ,而struts2的action显然是有状态的 ,所以必须显示设置为
scope=“prototype”

prototype为原型模式 , 每次action请求过来都会创建一个action

但是对那些Dao的实现类推介scope=“singleton” ,因为这些类没有状态,用singleton只需维护一个实例,显然性能高一些



请教一下,你们说的类有状态没有状态是什么意思呢?
如果一个DAO设置为单例模式,有2个竞争线程a,b同时访问这个DAO中的一个方法,不是有可能将a线程的调用结果返回给b线程吗?
难道要将dao里面的方法都加锁吗?
0 请登录后投票
   发表时间:2010-07-22  
matlab5y5 写道
笑我痴狂 写道
singleton是单态模式的 ,有ioc容器管理 ,当然不是线程安全的啦 ,不过所谓的线程安全也是相对的

如果你的类是没有状态的, 那用singleton 的性能要高一些 ,因为只有一个实例 。
如果你的类是有状态的 ,那就必须显示的设置为prototype了

在ssh2 项目中 , struts2的action交由spring管理的时候 ,spring默认是singleton的 ,而struts2的action显然是有状态的 ,所以必须显示设置为
scope=“prototype”

prototype为原型模式 , 每次action请求过来都会创建一个action

但是对那些Dao的实现类推介scope=“singleton” ,因为这些类没有状态,用singleton只需维护一个实例,显然性能高一些



请教一下,你们说的类有状态没有状态是什么意思呢?
如果一个DAO设置为单例模式,有2个竞争线程a,b同时访问这个DAO中的一个方法,不是有可能将a线程的调用结果返回给b线程吗?
难道要将dao里面的方法都加锁吗?

1.可操作属性 比如 UserDAO 里面有一个name属性。两个线程同时操作这一个属性。就可能引发一些问题。
2.这是不可能的。去看看jvm一些基本规范。
3.不用,看具体情况。
0 请登录后投票
   发表时间:2010-07-23  
IcyFenix 写道
用静态类没有你想象的方便,哪天你做测试时发现这个类依赖一堆静态类没法Mock掉就会骂娘了。



为了Mock掉, 赞!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics