zoukankan      html  css  js  c++  java
  • 有状态对象和无状态对象

    转 https://www.cnblogs.com/mrfangzheng/archive/2011/09/01/2161703.html

    无状态对象

    1. 用于处理逻辑, 而不是持有数据
    2. 把数据从一个有状态对象处理后传输到另一个有状态对象
    3. 属性和字段都是临时的, 不共享, 无需持久化
    4. 使用时随时创建, 随时丢弃

    有状态对象

    1. 持用数据
    2. 共享
    3. 需要持久化
    4. 保持内部数据一致
    5. 版本, 身份, 值比较, HashCode
    6. 数据访问: 遍历, 查找, 排序
    7. 数据变化事件



    转 https://blog.csdn.net/eff666/article/details/52495393

    /**
     * 有状态bean,有state,user等属性,并且user有存偖功能,是可变的。
     */
    public class StatefulBean {
    
        public int state;
        // 由于多线程环境下,user是引用对象,是非线程安全的
        public User user;
    
        public int getState() {
            return state;
        }
    
        public void setState(int state) {
            this.state = state;
        }
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    }
    
    /**
     * 无状态bean,不能存偖数据。因为没有任何属性,所以是不可变的。只有一系统的方法操作。
     */
    public class StatelessBeanService {
    
        // 虽然有billDao属性,但billDao是没有状态信息的,是Stateless Bean.
        BillDao billDao;
    
        public BillDao getBillDao() {
            return billDao;
        }
    
        public void setBillDao(BillDao billDao) {
            this.billDao = billDao;
        }
    
        public List<User> findUser(String Id) {
            return null;
        }
    }



    转 https://www.cnblogs.com/xubiao/p/6567349.html

    第三:Spring中的有状态(Stateful)和无状态(Stateless) 

    1.通过上面的分析,相信大家已经对有状态和无状态有了一定的理解。无状态的Bean适合用不变模式,技术就是单例模式,这样可以共享实例,提高性能。有状态的Bean,多线程环境下不安全,那么适合用Prototype原型模式。Prototype: 每次对bean的请求都会创建一个新的bean实例。 

    2.默认情况下,从Spring bean工厂所取得的实例为singleton(scope属性为singleton),容器只存在一个共享的bean实例。 

    3.理解了两者的关系,那么scope选择的原则就很容易了:有状态的bean都使用prototype作用域,而对无状态的bean则应该使用singleton作用域。 

    4.如Service层、Dao层用默认singleton就行,虽然Service类也有dao这样的属性,但dao这些类都是没有状态信息的,也就是相当于不变(immutable)类,所以不影响。Struts2中的Action因为会有User、BizEntity这样的实例对象,是有状态信息的,在多线程环境下是不安全的,所以Struts2默认的实现是Prototype模式。在Spring中,Struts2的Action中,scope要配成prototype作用域。  

     第四Servlet是单例模式
    1.Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web 容器负责的。一个Servlet类在Application中只有一个实例存在,也就是有多个线程在使用这个实例。这是单例模式的应用。无状态的单例是线程安全的,但我们如果在Servlet里用了实例变量,那么就变成有状态了,是非线程安全的。如下面的用法就是不安全的,因为user,out都是有状态信息的。 

    Java代码加深影响  :
    /** 
     * 非线程安全的Servlet。 
     * @author Peter Wei 
     * 
     */  
    public class UnSafeServlet HttpServlet{  
          
        User user;  
        PrintWriter out;  
          
        public void doGet (HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{  
            //do something...  
        }  
    }  


    Out,Request,Response,Session,Config,Page,PageContext是线程安全的,Application在整个系统内被使用,所以不是线程安全的.

     第五SpringMvc默认是单例默认Struts2默认的实现是Prototype模式。

  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/tabCtrlShift/p/9417160.html
Copyright © 2011-2022 走看看