我们正在使用 SpringTransactionInterceptor
来设置一些数据库分区信息,ThreadLocal
只要执行标记有@Transactional
注释的 DAO 方法。我们需要它能够将我们的查询路由到不同的数据库分区。
这适用于大多数 DAO 方法:
// this causes the invoke method to set a thread-local with the host name of
// the database server the partition is on
@Transactional
public int deleteAll() throws LocalDataException {
问题是当我们需要在 DAO 内部引用 DAO代理对象本身时。通常我们必须让调用者传入代理 dao:
public Pager<Foo, Long> getPager(FooDao proxyDao) {
这看起来像下面的代码,显然很恶心。
fooDao.getPager(fooDao);
问题是当我们在 FooDao 内部时,这this
不是我们需要的代理 DAO。
是否有更好的机制让 bean 发现它周围有一个代理包装器?我查看了Spring AOPUtils,但我看不到找到对象代理的方法。例如我不想isAopProxy(...)
。我也阅读了Spring AOP 文档,但除非我实现自己希望避免的 AOP 本机代码,否则我看不到解决方案。
ApplicationContextAware
我怀疑我可能能够使用实用程序 bean 和方法将 DAO 注入到自身中setProxyDao(...)
,但这似乎也是一种 hack。任何其他想法如何检测代理以便我可以从 bean 本身中使用它?谢谢你的帮助。