Struts2 Action 单例多例模式

来源:互联网 发布:房产经纪人签单软件 编辑:程序博客网 时间:2024/06/05 17:32

     很多时候我们学习框架,只知道怎么用,不知道起原理是什么。这样其实是很危险的一件事情,因为一出问题不知道为什么,折腾了好几天可能误打乱撞,折腾正确了,但是因为时间紧迫,赶项目,完全不去挖掘去原理,没有融会贯通,以后还是会遇到问题,又这样折腾,然后又解决了,这样导致知识点成孤岛,完全没有把他们联系起来。

     框架能够带给我们的是开发效率,让开发者对很多东西透明的,由于没有时间加之没有这个环境,或者因为个人原因,没有几个人能够真正学习了解框架的原理。好比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的时候,拿不到数据,报空指针。


0 0
原创粉丝点击