上文介绍了以xml方式配置aop实现多数据源自动切换,快捷门可点以下链接:Spring MVC框架搭建扩展–多数据源配置(一)
本文主要介绍以注解方式配置aop实现多数据源自动切换。
接上文从第4步开始变动:
1.准备一个Annotation,用于记录数据源名
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
String name() default DataSource.fdataSource;
public static String fdataSource = "fdataSource";
public static String sdataSource = "sdataSource";
}
2.准备一个切面
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class AspectDataSourceExchange{
@AfterReturning("execution(* com.ghca.service.impl.LoginServiceImpl.*(..))")
public void afterReturning(){
DataSourceContextHolder.clearDataSource();
}
@Before("execution(* com.ghca.service.impl.LoginServiceImpl.*(..))")
public void before(JoinPoint joinPoint){
// 从切点上获取目标方法
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
if (method.isAnnotationPresent(DataSource.class)) {
DataSource datasource = method.getAnnotation(DataSource.class);
if (null == datasource || (null != datasource && null == datasource.name())) {
DataSourceContextHolder.setDataSource(DataSource.fdataSource);
System.out.println("当前数据源为:" + DataSourceContextHolder.getDataSource());
}
else {
DataSourceContextHolder.setDataSource(datasource.name());
System.out.println("当前数据源为:" + DataSourceContextHolder.getDataSource());
}
}
}
}
3.aop配置
spring-mybatis.xml里(之前的直接注释掉)
<!-- 注册切换数据源bean (切面) -->
<!-- <bean id="aspectDataSourceExchange" class="com.ghca.util.db.AspectDataSourceExchange" /> -->
<!-- Spring aop事务管理 -->
<!-- <aop:config>
<aop:aspect id="aspect" ref="aspectDataSourceExchange">
<aop:pointcut expression="execution(* com.ghca.service.impl.LoginServiceImpl.*(..))"
id="transactionPointcut" />
<aop:before method="before" pointcut-ref="transactionPointcut"/>
<aop:after-returning method="afterReturning"
pointcut-ref="transactionPointcut"/>
</aop:aspect>
</aop:config> -->
4.激活代理
在spring-servlet.xml里
<!-- 激活自动代理功能 -->
<aop:aspectj-autoproxy />
(ps:
1. 配置的位置不对容易导致报错!尽量放在DispatcherServlet对应的xml文件里
2. proxy-target-class默认为false,如果配成true,则需导入CGLIB包
)
5.测试
(测试代码不变)