Spring中原型prototype

 

有状态会话bean   :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。 

无状态会话bean   :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean   的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean   并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的

 

到底用singleton 还是 prototype?

 

到底改用哪个scope?这决定于你所注入的对象是否包含状态。

比较适合用单例模式的就是dao/service,因为他们不包含变化的成员变量,方法调用不会改变这个对象的状态(它也没有状态可言),如下面这个类

只有一个成员变量sessionFactory,而该变量是由spring注入的,全局也只有一个,可以看成是BaseDaoImpl的一个静态变量,不存在状态变化。因此下面的类比较适合用singleton。

 
  1. @Repository("baseDao")

  2. public class BaseDaoImpl<T> implements BaseDaoI<T> {

  3. private SessionFactory sessionFactory;

  4. public SessionFactory getSessionFactory() {

  5. return sessionFactory;

  6. }

  7.  
  8. @Autowired

  9. public void setSessionFactory(SessionFactory sessionFactory) {

  10. this.sessionFactory = sessionFactory;

  11. }

  12. public Serializable save(T o) {

  13. return sessionFactory.getCurrentSession().save(o);

  14. }

  15.  
  16. public void delete(T o) {

  17. sessionFactory.getCurrentSession().delete(o);

  18. }

  19.  
  20.  
  21. public void update(T o) {

  22. sessionFactory.getCurrentSession().update(o);

  23. }

  24.  
  25.  
  26. public void saveOrUpdate(T o) {

  27. sessionFactory.getCurrentSession().saveOrUpdate(o);

  28. }

  29. }

 

那什么时候用prototype呢?

看下面代码

 
  1. public class UserAction extends BaseAction implements ModelDriven<UserDTO> {

  2. private static final long serialVersionUID = 1L;

  3. private UserDTO userDTO = new UserDTO();

  4. private UserServiceI userService;

  5.  
  6. public UserDTO getModel() {

  7. return userdto;

  8. }

  9.  
  10. public UserServiceI getUserService() {

  11. return userService;

  12. }

  13.  
  14. @Autowired

  15. public void setUserService(UserServiceI userService) {

  16. this.userService = userService;

  17. }

  18. }

这里有一个成员变量比较特殊 userDTO,它是由jsp传递过来并封装成的对象,而不同请求传递的参数又不同,也因此userDTO它是一个可变的变量。当我执行了login的 action 那么userDTO中便是login的用户信息,如果执行了register的action那么userDTO中便是注册的信息。假如我声明userAction为singleton会发生什么呢。我先执行注册,注册后这个userDTO被赋值,其值包含了用户注册的username,pwd,email,birthday等信息,并且该对象不会被销毁,之后我又执行了login的action,那么在login action中得到的userDTO对象中就包含了email,birthday等信息--这是我们不希望看到的。那么下次使用userAction时便又携带了上次执行后存在的状态。因此,用完userAction后必须销毁,然后由Spring容器再生成一个新的实例。这就是为什么要用prototype而不是singleton的理由了

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值