【spring系列】(2)——Spring AOP 实现企业间切库

需求:

       

        我们做的平台是提供给很多企业使用的,有个云端的库用来记录所有注册企业的信息,有四大系统的数据库名称记录在这个库中。最近在实现四大系统的联调。怎样可以将数据库写活。我和我可爱的产品经理想到了一个方法。那就是通过企业的门户下登陆后,通过登陆的用户名从云端数据库查询用户所属的企业,通过企业注册号再去组织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主要是提供另外一种编程思路,可以把类似的行为抽离出来统一处理。




评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值