最近看pluto源码,终于了解多个应用如何共享信息的一个小方法。然后写个小demo
首先写一个jar包,包中只有两个类,一个单例,一个Person的bean
public class MySingleClass {
private static MySingleClass instance;
public Person person;
public MySingleClass(Person p){
instance = this;
person = p;
}
public static MySingleClass getInstance(){
return instance;
}
}
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
写好后maven打成jar包,然后放入到tomcat的lib目录下。
之后再写两个项目,每个项目只有一个类,用于简单测试,然后很重要一点是两个maven项目都依赖上面的这个jar,但是scope都设为provided就是只在编译时引用。
项目一中这个类,在servlet容器启动后为MySingleClass以新建Person对象为参数生成单例。
public class MyServlet implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
Timer time = new Timer();
time.schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
Person person =new Person();
person.setName("mao");
new MySingleClass(person);
}
}, 10000);
}
}
项目二中,则读取MySingleClass单例的Person.name属性。
public class MyServlet implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
if(MySingleClass.getInstance() == null){
System.out.println("no name");
}else {
System.out.println(MySingleClass.getInstance().person.getName());
}
}
}, 10,1000);
}
}
当然不能忘记在各自的web.xml中注册listener。将两个项目部署到同一个tomcat启动结果会在打印几个no name之后打印mao。
为什么会这样呢?因为项目一将tomcat的lib目录下的MySingleClass加载到内存中,项目二就不会重新加载,因此他们的静态属性指的是同一个对象,也就是项目一中新建的MySingleClass实例。