【发布时间】:2012-07-16 18:09:05
【问题描述】:
每当执行标记有@Transactional 注释的DAO 方法时,我们使用Spring 的TransactionInterceptor 来设置一些数据库分区信息,使用ThreadLocal。我们需要它才能将我们的查询路由到不同的数据库分区。
这适用于大多数 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 proxy 对象本身时。通常我们必须让调用者传入 proxy-dao:
public Pager<Foo, Long> getPager(FooDao proxyDao) {
这看起来像下面的代码,显然很恶心。
fooDao.getPager(fooDao);
问题在于,当我们在 FooDao 内部时,this 不是我们需要的代理 DAO。
是否有更好的机制让 bean 发现它周围有代理包装器?我查看了Spring AOPUtils,但我看不到找到对象代理的方法。例如,我不想要isAopProxy(...)。我也阅读了Spring AOP docs,但我看不到解决方案,除非我实现自己希望避免的 AOP 本机代码。
我怀疑我可以使用 ApplicationContextAware 实用程序 bean 和 setProxyDao(...) 方法将 DAO 注入到自身中,但这似乎也是一种 hack。任何其他想法如何检测代理以便我可以从 bean 本身中使用它?感谢您的帮助。
【问题讨论】:
-
使用本机 Aspectj 加载/编译时编织根本不是一个选项 - 那么建议将编织到代理中,您不应该在代理中遇到代理问题和此引用?跨度>
-
this不会做@Thorbjørn 因为正如帖子所述,我需要代理而不是 bean 本身。 -
编写自己的原生 AOP 可能是我唯一的解决方案 @Biju。如果可以的话,我希望能避免它。谢谢你。
-
绝对是@Thorbjørn。无法替换或包装
this。 bean 本身看到this而not 是其他所有人都被注入的代理。这就是 AOP 的工作原理。