设计模式在实际开发中的使用——单例模式

单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

 

  • Runtime类

Runtime是个单例类,表示当前JVM的运行环境。

可以看如下测试代码

Runtime runtime1 = Runtime.getRuntime();
Runtime runtime2 = Runtime.getRuntime();
System.out.println(runtime1.equals(runtime2));

返回true,两个Runtime的实例是一个对象。所以要用Runtime的对象时,不用像上面代码定义一个Runtime runtime1对象,而是直接Runtime.getRuntime()拿来用。不管调用几次都是返回同一个实例。

 

  • Spring中的单例

如果在JVM中定义的单例类,可能由于长时间不用而被JVM自动回收。Spring的IOC容器里面定义的bean默认是单例,并且整个生命周期是Spring在管理,不会被JVM自动回收。

例如如下定义的service类

<bean id="helloWorldService" class="com.spring.HelloWorldService"/>

在J2EE工程里面,service和dao层都交给Spring管理,并且都是单例实现,每次拿到的service和到对象都是同一个对象。

 

  • 不适合使用单例的场景

前面说到service和dao层都是单例的,可是action呢。strusts2的action里面有成员变量,对应form表单提交的数据,所以struts2的action一定不能是单例,每次请求进的action都是不同的实例,否则在高并发下成员变量的值就会混乱。

假如将struts2的action交给spring管理,一定要加上@Scope("prototype")注释,该action不是一个单例。

@Controller
@Scope("prototype")
public class LoginAction extends BaseAction {

	@Resource
	private ILoginService loginService;

	private String userName; 
	private String passWord; 
}

 

同样的道理,Servlet在web容器中只被初始化一次,是个单例类,也就是所说的线程不安全。所以Servlet里面是没有成员变量的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值