①servlet単例モードおよびその単例クラスがいつ破壊されるか②サーバがユーザごとにスレッドを作成し、スレッドがいつ終了するか
3314 ワード
テストにより、リクエストが終了するたびに、単一クラスの静的属性はまだ存在し、ウィンドウを閉じても、単一クラスの静的属性は依然として存在し、単一クラスの静的属性のライフサイクルはtomcatに関係し、tomcatが閉じると、
単一のクラスの静的プロパティが消えます.
スレッドがいつ終了するか:sessionの存在により、スレッドのライフサイクルはsessionのライフサイクルに関係する可能性があります.
単一クラスのコードをテストします.
テストの効果:
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も同じオブジェクトである.
実はこのノートはしなくてもいいのです!!!