很多时候我们学习框架,只知道怎么用,不知道起原理是什么。这样其实是很危险的一件事情,因为一出问题不知道为什么,折腾了好几天可能误打乱撞,折腾正确了,但是因为时间紧迫,赶项目,完全不去挖掘去原理,没有融会贯通,以后还是会遇到问题,又这样折腾,然后又解决了,这样导致知识点成孤岛,完全没有把他们联系起来。
框架能够带给我们的是开发效率,让开发者对很多东西透明的,由于没有时间加之没有这个环境,或者因为个人原因,没有几个人能够真正学习了解框架的原理。好比J2EE开发著名三大框架SSH,会用的一大把,依葫芦画瓢,但是真正懂掌握的凤毛麟角。这是我一年的深痛领悟。今后的时间将会更加专注本质专注原理。
昨天遇到struts2的问题,不知为何,后来网上查阅了大量资料,动手验证。明白了Struts2 Action 单例多例模式。这里说明一下,如果不用spring注解的话,struts2默认是多例的。出现单例跟多例是因为用了spring注解。
@Controller("admin")
public class ccAction {
private KhzjBean khzjBean;
public void setKhzjBean(KhzjBean khzjBean) {
this.khzjBean = khzjBean;
}
public KhzjBean getKhzjBean() {
return khzjBean;
}
public void test1(){
khzjBean.setAddress("aaa");
khzjBean.setId(1);
}
public void test2(){
System.out.println(khzjBean.getAddress());
System.out.println(khzjBean.getId());
System.out.println(khzjBean.getName());
}
}
main.jsp采用这样的方式去访问
<body>
<a href="cc_test1.action?khzjBean.name=yyc">测试一</a>
<a href="cc_test2.action">测试二</a>
</body>
当点击了测试一,再去点击测试二,后台输出的aa 1 yyc
,然后我换了一个浏览器再去访问
<a href="cc_test2.action">测试二</a>
后台还是输出
aa 1 yyc
。
其它不变在@Controller("admin")后面加一个@Scope("prototype")。在同样的操作,点击测试一之后在点击测试二,报空指针异常!!
为什么会报空指针异常,因为用spring注解action的话,没有写Scope,默认是@Scope("singleton"),也就是默认是单例的。从此例子看,单例就是spring只new一个action,不管是张三访问还是李四访问,还是张三在不同时间访问,或者在不同浏览器访问,调用的都是同一个action。这个是有点危险的事,慎用!多例的意思是,张三访问,第一次进去的action和第二次进去的action是不一样的,spring自动装配一个新的action。所以上面的访问test2的时候,拿不到数据,报空指针。