科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道开源技术:将系统移植到Spring

开源技术:将系统移植到Spring

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

摘要: 作者将在这篇文章中分享他在这个试验中的想法和发现。作者将清晰的说明他是怎样用Spring组件替换参考应用中的单态注册,JDBC代码,和web的前后端层。作者也会描述他遇到的一个问题还有他是怎样来解决它的。 叫我来参加会议晚了。

作者:中国IT实验室 来源:中国IT实验室 2007年9月30日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共4页)

    注意,我已经用一个Spring的ApplicationContext(应用上下文)替换了旧的Map。和Map类似,ApplicationContext保存对象并且让你通过名字来取得它们。比较起来,ApplicationContext是通过一个外部配置的Xml文件来读取所有的对象定义。修改spring-objectregistry.xml中的对象定义需要重启应用,但不是全编译。
摘自spring-objectregistry.xml:

<bean  id="ObjectPool"  class="org.apache...GenericObjectPool"
  singleton="true"><-- omitted for brevity -->
</bean>

<bean  id="DataSource"  class="org.apache...PoolingDataSource"
  singleton="true">
  <property name="pool">
    <ref local="ObjectPool" />
  </property>
</bean>

<bean  id="DAO"  class="pool_test.data.jdbc.SimpleDAO" singleton="true">
  <property name="dataSource">
    <ref local="DataSource"/>
  </property>            
</bean>



    XML元素符合反射调用:外部的<bean/>元素定义一个对象,里面的<property/>元素调用对象上的方法。例如,对于ID为Dao的bean来说,Spring首先实例化一个SimpleDAO类型的对象并且调用它的setDataSource()方法。setDataSource()参数是id为DataSource的bean,在文件的前面有定义。

    在后台,Spring配置DataSource并且把它指派到DAO.其他的用Spring管理的对象要引用DAO只能通过它的bean名字"DAO",同样的,它们不知道这(就是"SimpleDAO")实现的改变。

    既然Spring管理了对象,那ObjectRegistry对客户端代码来讲,只有只读。我可以移出ObjectRegistry类put()方法和其他的类中外部调用的put()方法。例如:SetupDataSourceContextListener现在仅用来组装初始化链接的池。

    在web.xml部署描述下面也有一些固定负载。例如,一个用来指向本地jdbc和其他属性文件的上下文参数。Spring现在通过这些文件了来装配对象,并且自己分配这些值。

    Spring也关心在spring-objectregistry.xml文件中对象间的依赖跟踪。我以前在代码中进行处理。因为在这个应用中我用了更多的依赖注入,现在Spring确认这些被引用的对象在客户端代码试图使用他们之前,按照属性顺序创建。也就是说我已经放下了笔记性的工作只剩下清理我的代码了。

    有人可能在讨论关于一个完美的排除外在的需要的Ioc实现,可调用的ObjectRegistry类,并且让Spring在运行时管理对象间的关系。考虑到将来重构,以后它将会引起一点麻烦,但是现在我还是需要注册。

修改数据层:Spring JDBC

    配置通用的数据源大概是一个装饰XML的工作。除了模板JDBC代码外,Spring也提供基于DAO的类。也就是把对Connection的管理以及ResultSet和PreparedStatement的关闭交给Spring框架。而只留下我应用的一些特殊代码。
新的DAO和旧接口一样

package pool_test.data.jdbc ;

public class SimpleDAO {
  public void setupTable() ;
  public void putData() ;
  public Collection getData() ;
  public void destroyTable() ;
}



    实际上,它是个截然不同的东西。老版本的DAO里面有很多内嵌的JDBC代码,而新版本中把那个烦心的工作交给了Spring。

package pool_test.data.jdbc ;

public class SimpleDAO extends JdbcDaoSupport {

  private GetDataWorker _getDataWorker ;
  private PutDataWorker _putDataWorker ;
  private CreateTableWorker _createTableWorker ;
  private DestroyTableWorker _destroyTableWorker ;

  // constructor is now empty

  protected void initDao() throws Exception {
    
    super.initDao() ;
    
    _getDataWorker =
      new GetDataWorker( getDataSource() ) ;

    _putDataWorker =
      new PutDataWorker( getDataSource() ) ;

    _createTableWorker =
      new CreateTableWorker( getDataSource() ) ;

    _destroyTableWorker =
      new DestroyTableWorker( getDataSource() ) ;

    return ;
    
  } // initDao()

  public void setupTable() {
    _createTableWorker.update() ;
  }

  public Collection getData() {
    return( _getDataWorker.execute() ) ;
  }

  // ... destroyTable() and getData()
  //   follow similar conventions ...

}



    首先的变更是父类:SimpleDAO。它现在继承了JdbcDaoSupport,JdbcDaoSupport有一些方法和内部类用来进行数据库的工作。第一个方法是setDataSource(),它用来给这个对象指派一个DataSource。子类通过调用getDataSource()得到数据源。
initDao()是另一个从JdbcDaoSupport继承来的方法。父类通过调用该方法以让子类进行以前的初始化方法。在这里,SimpleDAO给它的成员变量赋值。

    成员变量也是新的:移除Spring JDBC也就是移出SimpleDAO的数据存取功能,而是指定像GetDateWorker和PutDataWorker.这样的内部类。每个DAO动作都有一个这样的内部类。例如,用来存储数据的PutDataWorker类

package pool_test.data.jdbc ;

import org.springframework ... SqlUpdate ;

public class SimpleDAO {

...
   private class PutDataWorker extends SqlUpdate {
    
     public PutDataWorker( final DataSource ds ){
      
       super( ds , SQL_PUT_DATA ) ;
    
       declareParameter(
             new SqlParameter( Types.VARCHAR ) ) ;
       declareParameter(
             new SqlParameter( Types.INTEGER ) ) ;

     }

     // a real app would load the SQL statements
     //   from an external source...
     private static final String SQL_PUT_DATA =
       "INSERT INTO info VALUES( ? , ? )" ;

   }

   ...
}



 

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章