需求:
我们做的平台是提供给很多企业使用的,有个云端的库用来记录所有注册企业的信息,有四大系统的数据库名称记录在这个库中。最近在实现四大系统的联调。怎样可以将数据库写活。我和我可爱的产品经理想到了一个方法。那就是通过企业的门户下登陆后,通过登陆的用户名从云端数据库查询用户所属的企业,通过企业注册号再去组织table中查询企业号。存入session缓存中,本来想存入cookie的,但是如果用户本地禁用cookie了。那就呵呵哒 了。
我们的系统的基于ejb的开发,设计的应用核心是部署分布式的应用程序。四大系统需要从我负责的这个系统获取数据名称,连接。大家之前开发都是直接写的自己开发库的名称,如果马上实现切库,会很麻烦。为了节省大家的时间,我想到了用aop,实现企业间切库。这样可以主动提供session,然后如果大家提交到Jenkins集成,只要统一修改一个公共类就ok了。下面讲讲我是怎么实现的。
实现:
1.在系统门户下存入session(只是controller中的代码,service细节不展示 了):
<span style="font-family:Microsoft YaHei;font-size:18px;">//**********zhouzhou增加企业号缓存:CompanyNumber--2016年7月28日18:49:18*********************
// 2.1 根据usercode查询userid
User user = new User();
user.setUserCode(userCode);
// 2.2 通过用户名称和数据库名称,在云端库里面查询用户的信息 --zhouzhou--2016年7月27日15:55:37
String strRegistUserId=startHomeBean.queryregistUserIdByuserCode(user.getUserCode(), "itoo_cloudroot");
// 2.3 通过注册号在云端Application表中获取其他子系统的企业号+_,例如“itoo_”
String strCompanyNumber= startHomeBean.queryByRegistUserId(strRegistUserId, "itoo_cloudroot");
// 2.4 将“企业号_”存入session缓存中
HttpSession session = request.getSession();
session.setAttribute("CompanyNumber", strCompanyNumber);
String test=(String) session.getAttribute("CompanyNumber");
// 2.5 通过用户code 和 数据库名称查找用户信息——在前台的数据库中查询
// 从session中获取当前用户对应数据库名
String databaseName = (String) session.getAttribute(
"CompanyNumber")+"authority";
user = startHomeBean.queryByuserCode(user.getUserCode(), databaseName);
//**********zhouzhou增加企业号缓存--2016年7月28日18:49:18*********************</span>
2.用考评系统下面的题型组件模块为例,在controller里面写一个类:databaseclass.java
<span style="font-family:Microsoft YaHei;font-size:18px;">package com.tgb.itoo.exam.component.controller;
import javax.servlet.http.HttpServletRequest;
public class DataBaseClass {
static HttpServletRequest request;
public static String test = (String)request.getSession()
.getAttribute("CompanyNumber")+ "exam";
public static String dataBaseName ;
public void test(){
System.out.println("zhouzhou----aop----ok");
//开发时候用这句写死的数据库
//dataBaseName="itoo_exam";
//集成的时候用这句获取session中的拼写数据库名称
dataBaseName=test;
}
}
</span>
controller里面所有获取数据库名称的地方全部改掉,改成咱们写的类里面的静态变量,获取数据库名称。
3.在applicationContext-common.xml配置文件中配置AOP ,如果你的配置文件内容很多,可以单独写一个xml,但是记得在web.xml中配置,读取spring的配置文件。
<span style="font-family:Microsoft YaHei;font-size:18px;"><!-- zhouzhou添加AOP拦截session信息 -->
<bean id="testBean" class="com.tgb.itoo.exam.component.controller.DataBaseClass" />
<aop:config>
<aop:pointcut id="printcut" expression="execution( * com.tgb.itoo.exam.component.controller.componentController.*(..)"/>
<aop:aspect ref="testBean">
<aop:before method="test" pointcut-ref="printcut"/>
</aop:aspect>
</aop:config>
</span>
web.xml 中加上你写的配置文件信息:
<span style="font-family:Microsoft YaHei;font-size:18px;"><servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/config/interceptor-servlet.xml,/WEB-INF/spring-mvc.xml,classpath:config/applicationContext-common.xml,classpath:config/application-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
</span>
总结:
spring aop的应用程序将代理程序运行时织入,AOP主要是提供另外一种编程思路,可以把类似的行为抽离出来统一处理。