很多学J2EE方向的同学都接触过S2SH,即传统的三大框架,学习这三个经典技术的重点就是挖原理和细节,慢慢地我们就能形成一套思想,以帮助理解其他新框架和新技术。学习技术本身并不难,设计技术方案才是难点,为什么要这么设计,这样设计的哲学依据又在哪?
不难发现:Struts2中控制层的action是多例的,在action层一般引用了逻辑层的单例service,而在逻辑层中又引用了单例的dao。因为作为控制层,action必须接受前端传递的参数,而Struts2又基于拦截器思想,建立HTTP请求后要经由复杂的拦截器才能到达控制层进行处理。这些参数就是action中的成员变量,如果并发请求action而action又是单例的,这不是会发生非线程安全么?而service顶多就只有dao的引用作为成员变量,dao本身也只有对操作数据库的包装类的引用充当成员变量,所以没有涉及到非线程安全,即本身就是线程安全。所以我们spring框架在默认情况下的bean都是单例模式。每一次访问方法进行处理都要new对象和回收对象,浪费系统资源,而单例模式就是可以解决这个问题。
以下的实验是在网络环境不怎么好的情况下进行的,把时长拉得更加明显。
非单例模式的情况:
controller层(Jersey框架,基于REST风格的Web Service)
@GET
@Path("history_station_user")
@Produces(MediaType.APPLICATION_JSON)
public String getHistoryStationUserInfo(
@QueryParam("area_list") @DefaultValue("null") String areaList,
@QueryParam("year_month") @DefaultValue("null") String yearMonth) {
if (areaList.equals("null") || areaList.length() == <