具体架构如下所示
      JSP(get/post)
       |
    action(serviceName=BLH别名,method=Method)
       |
      BLH(在xml文件中配置别名对应的BLH类名)
       |
      Method
       |
      BLL(@Transactional,property IDaoEx)[spring托管]
       |
      DAO(extends DaoEx[调用hibernate实现] implements IDaoEx)[spring托管]
       |
      POJO(直接写类通过注解加hbm2ddl生成对应的表)    我们项目中用了一个改造的struts1.3+spring2.0+hibernate3.2,在数据访问层有一个公用的Dao及其接口IDao(某个项目的遗留产物),在这个公用dao中实现对pojo的增、删、改、查、分页,然后我又对该dao及接口进行了增强,新添加了一个IDaoEx继承了IDao,添加了直接执行hql(主要针对批量操作使用)、统计(DetachedCriteria,Map,Hql三种方式),然后用DaoEx同时继承Dao和实现IDaoEx中的方法,然后项目中所有pojo用注解生成相应的表,所有dao都继承DaoEx(不同的是重载setEntity方法将不同的pojo.class设置进来),在spring中的bll类的IDaoEx接口属性注入相应的dao。最后在bll类中加上@transational使其每个方法默认添加事务。
    在struts中的action上面又加了一个blh层,通过在struts配置文件配置直接将action映射到blh中的方法,所以action做成一个通用的入口(具体哪个bll类的某个方法处理在配置文件中配置)和出口(具体由那个页面展现通过foward决定),blh有点类似dotnet中的后台页面cs,在blh中直接调用spring去取bll类(没有为bll设计接口)来实现业务逻辑。
    
    请问这样设计在扩展性和性能上面如何改进?还有就是现在用tomcat6做web服务器,oracle在一台服务器,每次web服务器启动网站初始化都失败,有可能是oracle那台服务起的太慢造成的,能否将spring初始化设置第一次访问网站才进行?   

解决方案 »

  1.   

    可以的.加个servlet过滤器,或者lisener,监听http
    有人访问时才初始化spring.
    sping是单例的.
      

  2.   

    多少层个人感觉没有太大的问题,web应用不管多少层,最终都是SQL操作,只要代码写的合理,考虑的问题细致,多少层都可以,有的时候,纯粹追求多少层,这样给客户以高深的感觉也不一定是好事,可能没有必要!
      

  3.   

    spring里面的bean可以改为,延迟加载的。
      

  4.   

    一般的应用,三层够了。如果业务逻辑比较复杂,可加一层业务处理层。这样方便处理事务和做SOA