你如何截获一个 bean 引用?

How do you intercept a bean reference?

我的 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>
    ...

我想显示每个 writer 中引用的 DataSource 的信息(JdbcBatchItemWriter class)。 DataSource 由 Spring DriverManagerDataSource.

实现

例如,显示信息:

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

所以我根据 ApplicationContextAware.

JdbcBatchItemWriter 包裹在 JdbcBatchItemWriterWrapper

因为 JdbcBatchItemWriter 没有任何 getDataSource() getter,我需要 resolve/instantiate 属性 [=22] 的 ref =] 以编程方式。我该怎么做?

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

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

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

不是提供 JdbcBatchItemWriter 作为 bean class,而是提供你的 subclass.