论坛首页 Java企业应用论坛

一种传递分页参数的方法

浏览 30766 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-03-02  
ajoo 写道
如果是immutable的,当然返回一个新的dao对象了。这个对象和原来的旧dao对象肯定都共享很多资源的,基本上就是一个非常轻量级的decorator


这个“共享狠多资源”,是代码写出来的,还是JVM做的?
0 请登录后投票
   发表时间:2006-03-02  
ajoo贴的java代码: 

引用

interface UserService{ 
  UserService withPagination(Pagination p);; 
  User findById(String id);; 
  User findByName(String name);; 
  ...... 
} 

interface UserDao{ 
  UserDao withPagination(Pagination p);; 
  User findById(String id);; 
  User findByName(String name);; 
  ... 
}


hongliang的回复

引用
ajoo,你这种方法,withPagination()方法返回的是什么?一个新的service/dao对象实例?本来service对象和dao对象可以是singleton的,按照你的这种方法,singleton可以吗?



拿spring举例来说:
  <bean id="daoDelegate" class="service.dao.hibernate.DefaultDAODelegate">
...

  <bean id="abstractServiceTarget" abstract="true" class="service.AbstractService">
    <property name="daoDelegate">
      <ref bean="daoDelegate"/>
    </property>
  </bean>

  <bean id="userService" parent="txProxyTemplate">
    <property name="target">
      <bean class="service.impl.UserServiceImpl" parent="abstractServiceTarget"/>
    </property>
  </bean>

(注:singleton缺省为true)


通过spring得到的userService并不是singleton的,因为声明的userService实际上是个ProxyFactoryBean,我猜想从spring中获取userService是这么一个过程(抱歉没深入看过源代码,凭感觉):

class BeanFactoryImpl{

  Object getBean(String beanId);{
    Object o = getBeanById(beanId);;
    if( o instanceof ProxyFactoryBean);{
        return ((ProxyFactoryBean);o);.createBean();;
    }
    return o;
  }
}

ProxyFactoryBean {
   Object createBean();{

      //这里我理解应该每次都是新创建实例
      Object o = enhanceOrProxyTarget(targetInterface, target);;
      
      return (targetInterface);target;
  }

   void setTarget(Object o);;

   Object getTarget();;
}

因此,配置中定义的userService和你在应用中获取的userService,不是同样一个东西。所以,虽然配置中userService(ProxyFactoryBean)是singleton的,但是应用中获取的userService只是ProxyFactoryBean的target的一个增强的实例而已。

不知道我理解对不对。


ajoo的答复
引用
如果是immutable的,当然返回一个新的dao对象了。这个对象和原来的旧dao对象肯定都共享很多资源的,基本上就是一个非常轻量级的decorator,所以singleton与否没有多大意义吧?节省那么几次创建对象的开销能省几个银子?

而如果是mutable的,就返回this。这样就可以singleton了。

mutable的优点,在于实现起来方便。缺点,在于状态会发生变化,如果用的不好,很可能出现不应该发生的分页之类的错误(比如,别的request做的分页影响到了当前request)。


我怎么感觉immutable(不变的)跟singleton(单实例)的关系更大一些?我有点糊涂了这里的immutable和mutable了。。。
0 请登录后投票
   发表时间:2006-03-03  
举个简单的dao实现的例子
class MyDaoImpl implements MyDao{
  private final Connection conn;
  private final Session session;
  
  ....//all other dependencies
  private final Pagination pagination;
  public MyDaoImpl(Connection c, Session s, ..., Pagination pagination);{
    this.conn = c;
    this.session = s;
    ....
    this.pagination = pagination;
  }
  public MyDaoImpl(Connection c, Session s, ...);{
    this.(c, s, ..., null);;
  }
  public MyDao withPagination(Pagination newPagination);{
    return new MyDaoImpl(conn, session, ..., newPagination);;
  }
  ...
}

这个withPagination()基本上就是一个functional update,也就是说,生成一个新的MyDaoImpl,所有的field都原封不动照抄,只有这个pagination对象用传递进来的值。

这样,无论原始的MyDaoImpl是否singleton,这个withPagination()必然返回新实例。因为它就是一个轻量级的对象,所以不singleton也无所谓。
0 请登录后投票
   发表时间:2006-03-03  
我受不了这个讨论叻,感觉越来越复杂,简单问题变复杂。。。我还是用老把式吧~~
0 请登录后投票
   发表时间:2006-03-15  
sorphi 写道
public Pagination findPaginationByCriteria(final Class entity, final Pagination pagination); { 
...
                                Integer count = (Integer); criteria.setProjection(Projections.rowCount(););.uniqueResult();; 
                                if (null != count); {

...



记录数为0,就不继续查询了。。。

我觉得这个代码里面的count永远都不会为null。。。


Oracle里会为null
uniqueResult()反正回的只是把数据库反回的值封装一下,具体有没有null值是要看数据库的,我现在只知道Oracle里count()的时候如果一条记录都没有会是一个null (抱歉,太菜了, ^_^)
0 请登录后投票
   发表时间:2006-03-15  
不知道是不是我理解错误。
因为ActionContext实际上是用ThreadLocal实现的。
直接在最终要处理的地方
Map params = ActionContext.getContext().getParameters();
直接可以获取Parameters。
除了key解析比较麻烦之外,应该跟自己定义ThreadLocal没啥区别吧。
不仅仅Parameters, session 之类的也全在里面了。不用自己传了。

附 ActionContext的doc连接:
http://www.opensymphony.com/webwork/api/com/opensymphony/xwork/ActionContext.html
0 请登录后投票
   发表时间:2006-03-23  
弱弱的问题一下,有的时候业务方法会对DAO区出来的数据进行筛选的,可能是那个安全框架的需要,这个时候只接在DAO里面分页会不会变得很奇怪???
0 请登录后投票
   发表时间:2006-03-23  
我有一个想法,在dao/service层,不带分页的参数,但是也不实际查询,只是暗中生成sql,到了Action层,加上分页的条件后,getResult的时候才真正去查询。

这样效率和接口的美观都照顾了。
不知道有没有人知道我的意思?
0 请登录后投票
   发表时间:2006-03-24  
这个实现起来好像有点困难。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics