你如何截获一个 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.
我的 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.