利用AOP 增强原理,在调用方法前 更改数据库DS注解的值,来达到切换数据库的作用,代码如下: /** * 切面的前置方法 即方法执行前拦截到的方法 * 在目标方法执行之前的通知 * @param jp */ @Before(EDP) public void doBefore(JoinPoint jp) throws Throwable { System.out.println("=========执行前置通知=========="); Object obj = jp.getTarget(); Method[] methods = obj.getClass().getDeclaredMethods(); if (methods != null && methods.length > 0) { for (int i = 0; i < methods.length; i++) { this.changeValue(methods[i]); } } }
private void changeValue(Method method) throws Throwable { Annotation dsAnnotation = this.getAnnotation(method); if (dsAnnotation == null) { return; } DS ds = (DS) dsAnnotation; if ("tes".equals(ds.value())) { InvocationHandler invocationHandler = Proxy.getInvocationHandler(ds); Field value = invocationHandler.getClass().getDeclaredField("memberValues"); value.setAccessible(true); Map<String, Object> memberValues = (Map<String, Object>) value.get(invocationHandler); String val = (String) memberValues.get("value"); val = ""; memberValues.put("value", val); }
但是这个不是很理想,因为在更改前,方法往往执行一次,导致先执行旧库后才执行新库,比较不现实,切换数据,在代码动态切换,是很难的,也是很不现实,不太正确的做法,如果真的要切换,往往要项目初始化的时候,就切换过来,前提要重启服务器,这个可以利用spring 的扩展类 前置处理器来做初始化。
有什么不对,请各位指正讨论,谢谢。