扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者