spring、struts2單例總結

1.前提:struts2、spring2.x環境

2.例子
public class TestAction extends ActionSupport {
private TestManager t1;
private TestManager t2 = new TestManager();

@Override
public String execute() throws Exception {
System.out.println("---------");
System.out.println("testManager1:" + t1 + ",i=" + t1.getIndex());
System.out.println("testManager2:" + t2 + ",i=" + t2.getIndex());
return null;
}

@Autowired
public void setT1(TestManager t1) {
this.t1 = t1;
}
}


@Component
//@Scope("prototype")
public class TestManager {
private int i;

public int getIndex() {
return ++i;
}
}


用瀏覽器連續訪問3次action控制檯顯示結果:
---------
testManager1:cn.com.super.service.TestManager@1a70128,i=1
testManager2:cn.com.super.service.TestManager@13cfd6e,i=1
---------
testManager1:cn.com.super.service.TestManager@1a70128,i=2
testManager2:cn.com.super.service.TestManager@5569ba,i=1
---------
testManager1:cn.com.super.service.TestManager@1a70128,i=3
testManager2:cn.com.super.service.TestManager@f4f9c,i=1


通過對注入的t1和new出來的t2兩個實例變量的比較可知,t1在3次訪問中只有一個實例,而t2則每次訪問都是不同的實例。由此可知:
1. struts2創建的action爲多例。
2. 通過Autowired注入的bean默認爲單例。
3. 如果要讓bean爲多例可以添加註解:@Scope(“protorype”)。
4. 若注入的bean爲單例需要注意線程安全問題,儘量不要使用成員變量。
5. 一個bean注入生成第一個實例後,以後不管在那個類中注入此bean都將使用第一次生成的這個實例,即整個過程中都只有這一個單例存在。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章