我的xml配置中包含以下内容。我想将这些转换为我的代码,因为我正在容器外部进行一些单元/集成测试。

XML:

<bean id="MyMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="configLocation" value="classpath:sql-map-config-oracle.xml"/>
  <property name="dataSource" ref="IbatisDataSourceOracle"/>
 </bean>

<bean id="IbatisDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/my/mydb"/>
</bean>


我以前从xmls中获取内容的代码:

this.setSqlMapClient((SqlMapClient)ApplicationInitializer.getApplicationContext().getBean("MyMapClient"));


我的代码(用于单元测试):

SqlMapClientFactoryBean bean = new SqlMapClientFactoryBean();
UrlResource urlrc = new UrlResource("file:/data/config.xml");
bean.setConfigLocation(urlrc);
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@123.210.85.56:1522:ORCL");
dataSource.setUsername("dbo_mine");
dataSource.setPassword("dbo_mypwd");
bean.setDataSource(dataSource);

SqlMapClient sql = (SqlMapClient) bean; //code fails here


当使用xml时,SqlMapClient是设置的类,那么我怎么不能将SqlMapClientFactoryBean转换为SqlMapClient

最佳答案

SqlMapClientFactoryBean是一个FactoryBean。它本身并没有实现SqlMapClient接口,但是制造了SqlMapClient实例,这些实例在调用getObject()方法时返回。 Spring容器了解FactoryBeans,并从调用者的角度使它们看起来像普通的bean。我不确定在容器外部使用FactoryBean是否可以工作-如果在容器生命周期之外调用getObject(),则可能会收到“未初始化”异常。

为什么不为您的测试用例创建一个单独的,精简的Spring配置,实例化该实例,然后从中获取bean?或者,您可以以非Spring方式创建SqlMapClient并将其设置在DAO上

09-30 23:36