变量和类离开作用域,变量所分配的内存空间将被JVM回收。
变量:在同一作用域范围的包裹下成员变量名和局部变量名是可以变量名相同的,在同一个作用域范围的包裹下局部变量和局部变量不可以变量名相同(作用域内不能重复命名),在方法中使用变量的时候如果不指明使用成员变量还是局部变量,那么默认的就是使用局部的那个变量,但是如果局部变量超出了它本身的作用域范围则会失效,被JVM垃圾回收,那么则可以重复命名此变量,并使用最新定义的这个局部变量。
对象:Java对象不具备与主类型一样的存在时间。用new关键字创建一个Java对象的时候,它会超出作用域的范围之外。
Spring bean 的作用域:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/> 或者 <bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>
2、prototype
<bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/> 或者 <beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/>
3、request
<web-app> ... <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> ... </web-app>
4、session
<bean id="role" class="spring.chapter2.maryGame.Role" scope="session"/>
5、global session
<bean id="role" class="spring.chapter2.maryGame.Role" scope="global session"/>
Servlet是单实例的。
servlet确实是单实例的,或者说是单态的,所有如果servlet中有一个成员变量,那么这个成员变量确实不是线程安全的,多个线程间可以互相影响。
struts1 中actioin 是单例。
即所有session对应一个action由spring来创建action时,默认处理,为单例(既然是单例,即使你设置成了多例,也不影响程序功能)
struts2 中action 是多例。
即一个session产生一个action。由spring来创建action时,须设置为prototype的,不能是singleton。
之所以struts2中action必须是多例的,主要原因在与请求数据和返回数据,大多都封装到了action中,用于实例变量,这样以来,如果将action设置成单例模式,则多个县城访问的时候,就会共享这些数据,从而引起数据混乱或者线程安全问题!
线程模式:
" Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
" Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)