①servlet单例模式以及该单例类何时才会毁掉②服务器为每个用户创建线程,线程何时终止问题
2013-04-13 21:56
363 查看
经测试,每次请求结束后,单例类中的静态属性还在,即使关闭窗口,单例类的静态属性依然存在,单例类的静态属性的生命周期与tomcat有关,当tomcat关闭的时候,
单例类的静态属性才会消失。。
线程何时终止:由于session的存在,线程的生命周期或许与session的生命周期有关。。
测试单例类的代码:
package com.zjlolife.util;
import java.util.HashMap;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.zjlolife.domain.User;
public class BeanFactory {
private Document doc;
private Map beans = new HashMap();
private static BeanFactory instance = new BeanFactory();
private BeanFactory() {
try {
doc = new SAXReader().read(Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream("application-beans.xml"));
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static BeanFactory getInstance() {
System.out.println(instance);
return instance;
}
@SuppressWarnings("unchecked")
public Object getBean(Class c) {
Object object = null;
if (beans.containsKey(c.getName())) {
object = beans.get(c.getName());
return object;
} else {
Element elt = (Element) doc.selectObject("//bean[@id=\""
+ c.getName() + "\"]");
try {
object = Class.forName(elt.attributeValue("class"))
.newInstance();
beans.put(c.getName(), object);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return object;
}
public static void main(String [] args) {
User user = (User)BeanFactory.getInstance().getBean(User.class);
System.out.println(user);
}
}
测试效果:
只要tomcat没关闭,每个用户访问的BeanFactory的实例instance都是同一对象,因此BeanFactory中的User也是同一对象。。。
其实这笔记可以不做的!!!
单例类的静态属性才会消失。。
线程何时终止:由于session的存在,线程的生命周期或许与session的生命周期有关。。
测试单例类的代码:
package com.zjlolife.util;
import java.util.HashMap;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.zjlolife.domain.User;
public class BeanFactory {
private Document doc;
private Map beans = new HashMap();
private static BeanFactory instance = new BeanFactory();
private BeanFactory() {
try {
doc = new SAXReader().read(Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream("application-beans.xml"));
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static BeanFactory getInstance() {
System.out.println(instance);
return instance;
}
@SuppressWarnings("unchecked")
public Object getBean(Class c) {
Object object = null;
if (beans.containsKey(c.getName())) {
object = beans.get(c.getName());
return object;
} else {
Element elt = (Element) doc.selectObject("//bean[@id=\""
+ c.getName() + "\"]");
try {
object = Class.forName(elt.attributeValue("class"))
.newInstance();
beans.put(c.getName(), object);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return object;
}
public static void main(String [] args) {
User user = (User)BeanFactory.getInstance().getBean(User.class);
System.out.println(user);
}
}
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="com.zjlolife.domain.User" class="com.zjlolife.domain.User" /> </beans>
package com.zjlolife.domain; public class User { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package com.zjlolife.web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zjlolife.domain.User; import com.zjlolife.util.BeanFactory; public class TestServlet extends HttpServlet { public TestServlet() { super(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { User user =(User)BeanFactory.getInstance().getBean(User.class); System.out.println(user); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
测试效果:
只要tomcat没关闭,每个用户访问的BeanFactory的实例instance都是同一对象,因此BeanFactory中的User也是同一对象。。。
其实这笔记可以不做的!!!
相关文章推荐
- 一个Servlet同一时刻只有一个实例。 当多个请求发送到同一个Servlet,服务器会为每个请求创建一个新线程来处理。
- win32线程创建、线程同步以及读者写者问题
- 选择目录,选择文件夹的COM组件问题。在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。
- 解决mysql-server yum安装包找不到的问题以及解决mysql创建用户问题
- Java - Servlet中如何获取用户配置的初始化参数以及服务器上下文参数?
- 转帖】在内核模式下创建和终止线程 收藏
- Java多线程基础,线程的创建使用以及终止
- Oracle11g创建表空间、创建用户、角色授权、导入导出表以及中文字符乱码问题
- Oracle11g创建表空间、创建用户、角色授权、导入导出表以及中文字符乱码问题
- 多线程,线程创建及关闭句柄存在的问题,终止线程的运行的几个函数
- 同一线程多次创建 的 线程资源释放问题在每个线程的一开始,用pthred_detach(pthread_self())来使自己detach掉
- idea创建web项目部署到tomcat服务器,servlet不能用问题解决
- 线程的创建、等待、终止以及属性
- 【转帖】在内核模式下创建和终止线程
- MongoDb 创建用户以及其他版本造成的一些问题
- Android 之 子线程中创建子线程以及子线程中toast 问题
- Oracle11g创建表空间、创建用户、角色授权、导入导出表以及中文字符乱码问题
- 在内核模式下创建和终止线程
- vsftpd服务器批量创建用户之pasv模式脚本
- TCP并发服务器(六)——创建线程池,每个线程accept,accept使用互斥锁保护——基于UNP代码