日期:2014-05-19  浏览次数:20739 次

关于Spring 的scope="prototype"的问题~
XML code

<!-- 配置用户信息userInfo的bean -->
    <bean id="userDao" class="com.aaa.daoImpl.UserDaoImpl">
        <property name="sessionFactory">
            <ref bean="sessionFactory"></ref>
        </property>
    </bean>
    <bean id="userService" class="com.aaa.serviceImpl.UserServiceImpl">
        <property name="userDao">
            <ref bean="userDao"></ref>
        </property>
    </bean>
    <bean id="userAction" class="com.aaa.action.UserInfoAction"
        scope="prototype">
        <property name="userService">
            <ref bean="userService"></ref>
        </property>
    </bean>




项目架构为SSH ,请问有必要设置 scope="prototype" 吗?今天听说 scope="prototype"对性能有很大的影响,请问什么时候使用scope="prototype"这个呢?

------解决方案--------------------
scope="prototype" 是控制 你配置的action是单例模式还是多例模式,默认是单例的。 
你这样子配置之后会导致每一次的action请求都会产生一个action类的实例,性能影响肯定是有的,但是这应该不要紧吧,在某些情况下是必须使用多例模式的,比如: 如果有使用struts2的 验证框架用的单例模式 那么每次产生的提示信息就会叠加起来。。。。
------解决方案--------------------
spring API里
The prototype scope :
The non-singleton, prototype scope of bean deployment results in the creation of a new bean instance every time a request for that specific bean is made. 
现学现卖。。。
总的来说就是每次都实例化一个新的对象。因为spring默认是单例的。


------解决方案--------------------
scope="prototype" 会在该类型的对象被请求

时创建一个新的action对象。如果没有配置scope=prototype则添加的时候不会新建一个action,他仍然会保留上次访问的过记录的信息

webwork的Action不是线程安全的,要求在多线程环境下必须是一个线程对应一个独立的实例,不能使用singleton。所以,我们在Spring配置Webwork Action Bean时,
需要加上属性scope=”prototype”或singleton=”false”。

singleton模式指的是对某个对象的完全共享,包括代码空间和数据空间,说白了,如果一个类是singleton的,假如这个类有成员变量,那么这个成员变量的值是各个线程共享的
(有点类似于static的样子了),当线程A往给变量赋了一个值以后,线程B就能读出这个值。因此,对于前台Action,肯定不能使用singleton的模式,
必须是一个线程请求对应一个独立的实例。推而广之,只要是带数据成员变量的类,为了防止
多个线程混用数据,就不能使用singleton。对于我们用到的Service、Dao,之所以用了singleton,
就是因为他们没有用到数据成员变量,如果谁的Service需要数据成员变量,请设置singleton=false。