你如何拦截bean引用?

时间:2015-10-01 15:59:59

标签: spring spring-bean

我的Spring配置看起来像

    ...
    <bean id="myWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
        ...
        <property name="sql" value="%[insert.sql.command]" />
 ==>    <property name="dataSource" ref="outDataSource1" />
    </bean>

    <bean id="myWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
        ...
        <property name="sql" value="%[insert.sql.command]" />
 ==>    <property name="dataSource" ref="outDataSource2" />
    </bean>
    ...
    <bean id="outDataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="%[outds1.driverClassName]" />
        <property name="url" value="%[outds1.url]" />
        <property name="username" value="%[outds1.username]" />
        <property name="password" value="%[outds1.password]" />
    </bean>

    <bean id="outDataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="%[outds2.driverClassName]" />
        <property name="url" value="%[outds2.url]" />
        <property name="username" value="%[outds2.username]" />
        <property name="password" value="%[outds2.password]" />
    </bean>
    ...

我想显示每个编写器DataSource类)中引用的JdbcBatchItemWriter的信息。 DataSource由Spring DriverManagerDataSource实现。

例如,显示信息:

(DriverManagerDataSource).getUrl()
(DriverManagerDataSource).getUsername()

所以我将JdbcBatchItemWriter包裹在JdbcBatchItemWriterWrapper中,基于ApplicationContextAware

由于JdbcBatchItemWriter没有getDataSource()个getter,我需要以编程方式解析/实例化ref属性dataSource。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您可以拦截DataSource的唯一地方是

隐含的setDataSource来电之前
<property name="dataSource" ref="outDataSource2" />

一种解决方案是扩展JdbcBatchItemWriter并覆盖其setDataSource,记录传递给它的值,然后委托给super实现。

不是提供JdbcBatchItemWriter作为bean类,而是提供子类。