一个使用 Spring AOP 和注解实现( MyBatis)数据库读写分离的问题

2015-07-30 12:29:21 +08:00
 mawenjian
原文: http://www.cnblogs.com/surge/p/3582248.html。

这篇文章的原理就是利用Spring AOP对DAO层中的方法的注解值进行判断,然后使用不同的DataSource,进而实现数据库的读写分离。

比如:
public interface UserMapper {
@DataSource("master")
public void add(User user);
@DataSource("slave")
public List<User> list();
}
利用@DataSource注解,就会分别从两个数据源读/写数据。

下面是注解:
<!-- 配置数据库注解aop -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<beans:bean id="manyDataSourceAspect" class="com.abc.proxy.DataSourceAspect" />
<aop:config>
<aop:aspect id="c" ref="manyDataSourceAspect">
<aop:pointcut id="tx" expression="execution(* com.abc.mapper.*.*(..))"/>
<aop:before pointcut-ref="tx" method="before"/>
</aop:aspect>
</aop:config>
<!-- 配置数据库注解aop -->

但是我在按照这个教程配置的过程中,发现这个配置是走不通的。因为@DataSource是针对方法级别的,但是determineCurrentLookupKey方法为SqlSessionFactory等类的构造中需要的,执行顺序是determineCurrentLookupKey->before,所以annotation方法就失效了?请问应当如何处理?

当然,用别的方式实现也行。多谢!
5426 次点击
所在节点    问与答
1 条回复
pucika
2018-04-16 13:30:19 +08:00
切面切不到具体的 class, mapper 紧定义了 interface。要么包一层 service,要么看怎么能在具体的实现类做切面。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/209519

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX